Tôi giả sử theo một số cách (hoặc cả hai) Delegate
hoặc MethodInfo
đủ điều kiện cho tiêu đề này. Tuy nhiên, không cung cấp tính độc đáo của cú pháp mà tôi đang tìm kiếm. Vì vậy, trong ngắn hạn, Có một số cách mà tôi có thể viết như sau:Con trỏ hàm trong C#
FunctionPointer foo = // whatever, create the function pointer using mechanisms
foo();
tôi không thể sử dụng một đại biểu rắn (ví dụ, bằng cách sử dụng từ khóa delegate
để khai báo một loại đại biểu) vì không có cách biết cho đến khi chạy danh sách tham số chính xác. Để tham khảo, đây là những gì tôi đã được chơi trong LINQPad hiện tại, trong đó B
sẽ là (chủ yếu) mã do người dùng tạo, và do đó sẽ là Main
và do đó độc đáo cho người dùng của tôi, tôi đang cố gắng xóa .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.");
}
}
Trong khi tôi coi bạn là một thiên tài để nghĩ về điều này, tôi nhận được lỗi liên kết khi tôi cố gắng tạo đại biểu với: return (DynamicFunction) Delegate.CreateDelegate (typeof (DynamicFunction), \t \t \t \t, chức năng [chức năng]); –
Đó là phức tạp hơn rất nhiều ... treo trên. –
Được rồi, có thể không phức tạp ... xem cập nhật. –