动态查找要作为<t>传递给泛型方法</t>的参数

时间:2010-06-17 09:12:18

标签: c# generics dynamic parameters runtime

泛型方法定义如下:

    private static T GetComparisonObject<T>(ComparisonAttribute attribute, object objectToParse)
    {

        // Perform a some action
        return (T)resultObject;
    }

调用方法如下:

var srcObjectToCompare = GetComparisonObject<DynamicType>(attributeToCompare, srcObject);

需要调用该方法的类型在配置文件中配置为:

<add attributename ="Count" attributetype ="MemberInformation" attributeparam ="Count" type="System.Int32" comparertype="ditCreditEMGTestAutomationDifferenceEngine.Comparers.TypeComparer, ditCreditEMGTestAutomationDifferenceEngine.dll"  />

在&lt;&gt;中传递的令牌对于泛型方法,必须是调用该方法的类型。从XML中的类型键配置,可以创建重新类型化的类型实例{即。 Type.GetType(“System.Int32”)},但是如何生成类型定义,然后可以将其传递给Generic方法?

希望我不会错过这里的小学! :-O

提前致谢。

2 个答案:

答案 0 :(得分:3)

使用反射调用泛型方法

MethodInfo method = typeof(YourClass).GetMethod("GetComparisonObject");
MethodInfo generic = method.MakeGenericMethod(GenericArgumentType);
Object retVal = generic.Invoke(this, new object[] { attribute, parseObject });

答案 1 :(得分:1)

你必须使用反射:

Type runtimeType = //get the type
MethodInfo method = typeof(MyClass).GetMethod("GetComparisonObject").MakeGenericMethod(runtimeType);
object returnValue = method.Invoke(null, new object[] { attribute, parseObject });

但是,重要的是要注意这种方法会抛弃泛型的全部价值。正如您在上面看到的,方法调用的结果是object,由于我们在编译时不知道类型,因此我们无法进行任何类型检查。如果在编译时不知道类型,那么使用泛型方法就没有意义了。