私は単純なクラスを持っています:
class Test
{
public static int Test<T>(T arg)
{
return 1;
}
}
Delegate
このメソッドを表す型のオブジェクトを取得したいと思います。そのような代理人を作成することは可能ですか? 任意の数のパラメーターとジェネリック引数を持つメソッドをDelegate
.
ここではデリゲートを使用したくありません。MethodInfo
インスタンスが必要です:
void ImportMethod(string name, MethodInfo method)
次のように呼び出します。
void ImportMethod("Test", typeof(Test).GetMethod("Test", ...Static));
タイプ セーフを維持するためにジェネリックを使用してメソッドを作成する場合は、異なる量の入力パラメーターを持つメソッドごとに 2 つのメソッドを作成する必要があります。1 つは void メソッド (Action) 用で、もう 1 つは値を返すメソッド (Func) 用です。メソッドのインポートごとに渡す必要がある一般的なパラメーターの数を削減するため、ヘルパー クラスを追加しました。メソッドを呼び出すときの IntelliSense にも役立ちます。
public class Foo
{
public void Bar()
{
}
public void Bar(string input)
{
}
public bool BarReturn()
{
return false;
}
}
public class ImportHelper<TClass>
{
public void Import(string name, Expression<Action<TClass>> methodExpression)
{
ImportMethod(name, methodExpression);
}
public void ImportMethodWithParam<TParam>(string name, Expression<Action<TClass, TParam>> methodExpression)
{
ImportMethod<TClass, TParam>(name, methodExpression);
}
public void ImportMethodWithResult<TResult>(string name, Expression<Func<TClass, TResult>> methodExpression)
{
ImportMethod<TClass, TResult>(name, methodExpression);
}
}
private static void TestImport()
{
ImportMethod<Foo>("MyMethod", f => f.Bar());
ImportMethod<Foo, string>("MyMethod1", (f, p) => f.Bar(p));
ImportMethod<Foo, bool>("MyMethod2", f => f.BarReturn());
var helper = new ImportHelper<Foo>();
helper.Import("MyMethod", f => f.Bar());
helper.ImportMethodWithParam<string>("MyMethod1", (f, p) => f.Bar(p));
helper.ImportMethodWithResult("MyMethod2", f => f.BarReturn());
}
public static void ImportMethod<TClass>(string name, Expression<Action<TClass>> methodExpression)
{
var method = GetMethodInfo(methodExpression.Body as MethodCallExpression);
//Do what you want with the method.
}
public static void ImportMethod<TClass, TParam>(string name, Expression<Action<TClass, TParam>> methodExpression)
{
var method = GetMethodInfo(methodExpression.Body as MethodCallExpression);
//Do what you want with the method.
}
public static void ImportMethod<TClass, TResult>(string name, Expression<Func<TClass, TResult>> methodExpression)
{
var method = GetMethodInfo(methodExpression.Body as MethodCallExpression);
//Do what you want with the method.
}
private static MethodInfo GetMethodInfo(MethodCallExpression methodCallExpression)
{
if (methodCallExpression == null)
return null;
return methodCallExpression.Method;
}
次を使用して「デリゲートオブジェクト」を取得できます
Func<int> func = () => Test<Foo>(bar);
あなたが使用することができます
void ImportMethod(string name, Action action)
また
void ImportMethod(string name, Func<int> func)
戻り値が必要かどうかに応じて、このように登録します
ImportMethod("Name", () => Test<Foo>(bar))
public delegate int Del<T>(T item);