Mi piacerebbe ottenere un MethodInfo
di un metodo da una classe generica avente un parametro di tipo noto solo al runtime.Come trovare MethodInfo per un metodo di una classe generica utilizzando il reflection fortemente tipizzato?
Ecco come vorrei avere un MethodInfo
per un metodo generico da una classe non generica:
class MyClass
{
public void MyMethod<T> (T arg)
{
}
}
static MethodInfo Resolve (Type type)
{
Expression<Action<MyClass, object>> lambda = (c, a) => c.MyMethod (a);
MethodCallExpression call = lambda.Body as MethodCallExpression;
return call
.Method // Get MethodInfo for MyClass.MyMethod<object>
.GetGenericMethodDefinition() // Get MethodInfo for MyClass.MyMethod<>
.MakeGenericMethod (type); // Get MethodInfo for MyClass.MyMethod<int>
}
Resolve (typeof (int)).Invoke (new MyClass(), new object[] {3});
Ora, se voglio provare qualcosa di simile con una classe generica:
class MyClass<T>
{
public void MyMethod (T arg)
{
}
}
static MethodInfo Resolve (Type type)
{
Expression<Action<MyClass<object>, object>> lambda = (c, a) => c.MyMethod (a);
MethodCallExpression call = lambda.Body as MethodCallExpression;
return call
.Method // Get MethodInfo for MyClass<object>.MyMethod
.SomeMagicMethod(); // FIXME: how can I get a MethodInfo
// for MyClass<T>.MyMethod where typeof (T) == type?
}
Resolve (typeof (string)).Invoke (new MyClass<string>(), new object[] {"Hello, World!"});
È possibile?
che è difficile perché 'C .Meth' e' C .Meth' sarebbe metodi totalmente estranei a seconda del sistema di tipo .NET perché il loro 'DeclaringType' s sono diversi. –
usr
È possibile correggere il codice della soluzione? Stai usando la variabile 'method' sia come' MethodInfo' che come 'MethodInfo []'. E anche cercare la corrispondenza dell'array con la stessa variabile. Non ha senso. – kjbartel
Il 'metodo' variabile' dovrebbe essere effettivamente un array, ma il secondo passaggio di ricerca contiene la soluzione quindi è tutto tranne un errore. Considera di leggere di nuovo la domanda. – r3c