में फ़ंक्शन पॉइंटर्स मुझे लगता है कि कुछ तरीकों से (या दोनों) Delegate
या MethodInfo
इस शीर्षक के लिए अर्हता प्राप्त करते हैं। हालांकि, न तो मैं जिस वाक्य की तलाश कर रहा हूं वह वाक्य रचनात्मक नग्नता प्रदान करता है। तो, संक्षेप में, वहाँ कुछ रास्ता है कि मैं निम्नलिखित लिख सकते है:सी #
FunctionPointer foo = // whatever, create the function pointer using mechanisms
foo();
मैं एक ठोस प्रतिनिधि उपयोग नहीं कर सकते (यानी, delegate
कीवर्ड का उपयोग एक प्रतिनिधि प्रकार की घोषणा करने) का कोई रास्ता नहीं है, क्योंकि रनटाइम तक सटीक पैरामीटर सूची तक जानना। संदर्भ के लिए, यहां मैं LINQPad में वर्तमान में क्या कर रहा हूं, जहां B
(अधिकतर) उपयोगकर्ता उत्पन्न कोड होगा, और इसलिए Main
होगा, और इसलिए मेरे उपयोगकर्ताओं के लिए nicety के लिए, मैं .Call
:
void Main()
{
A foo = new B();
foo["SomeFuntion"].Call();
}
// Define other methods and classes here
interface IFunction {
void Call();
void Call(params object[] parameters);
}
class A {
private class Function : IFunction {
private MethodInfo _mi;
private A _this;
public Function(A @this, MethodInfo mi) {
_mi = mi;
_this = @this;
}
public void Call() { Call(null); }
public void Call(params object[] parameters) {
_mi.Invoke(_this, parameters);
}
}
Dictionary<string, MethodInfo> functions = new Dictionary<string, MethodInfo>();
public A() {
List<MethodInfo> ml = new List<MethodInfo>(this.GetType().GetMethods());
foreach (MethodInfo mi in typeof(Object).GetMethods())
{
for (int i = 0; i < ml.Count; i++)
{
if (ml[i].Name == mi.Name)
ml.RemoveAt(i);
}
}
foreach (MethodInfo mi in ml)
{
functions[mi.Name] = mi;
}
}
public IFunction this[string function] {
get {
if (!functions.ContainsKey(function))
throw new ArgumentException();
return new Function(this, functions[function]);
}
}
}
sealed class B : A {
public void SomeFuntion() {
Console.WriteLine("SomeFunction called.");
}
}
जबकि मैं आपको इस बारे में सोचने के लिए एक प्रतिभा मानता हूं, जब मैं प्रतिनिधियों को रिटर्न (डायनेमिक फ़ंक्शन) प्रतिनिधि के साथ बनाने का प्रयास करता हूं तो मुझे बाध्य त्रुटियां मिल रही हैं।CreateDelegate (टाइपफ़ोफ़ (डायनामिक फ़ंक्शन), \t \t \t \t यह, फ़ंक्शन [फ़ंक्शन]); –
यह बहुत अधिक जटिल है ... लटकाओ। –
ठीक है, शायद वह जटिल नहीं ... अद्यतन देखें। –