这是我基于Grax的回答的2美分,但是对于一个泛型方法需要两个参数。
假设你的方法在一个Helpers类中定义如下:
public class Helpers
{
public static U ConvertCsvDataToCollection<U, T>(string csvData)
where U : ObservableCollection<T>
{
//transform code here
}
}
在我的例子中,U类型总是一个存储类型T对象的可观察集合。
因为我已经预定义了我的类型,我首先创建了“虚拟”对象,表示可观察集合(U)和存储在其中的对象(T),这将在调用Make时用于下面获得它们的类型
object myCollection = Activator.CreateInstance(collectionType);
object myoObject = Activator.CreateInstance(objectType);
然后调用GetMethod找到你的Generic函数:
MethodInfo method = typeof(Helpers).
GetMethod("ConvertCsvDataToCollection");
到目前为止,上面的调用与上面解释的几乎相同,但当您需要传递多个参数时,有一点不同。
你需要传递一个Type[]数组给MakeGenericMethod函数,它包含上面创建的“虚拟”对象的类型:
MethodInfo generic = method.MakeGenericMethod(
new Type[] {
myCollection.GetType(),
myObject.GetType()
});
完成之后,您需要调用上面提到的Invoke方法。
generic.Invoke(null, new object[] { csvData });
做完了。很有魅力!
更新:
正如@Bevan突出显示的那样,当调用MakeGenericMethod函数时,我不需要创建一个数组,因为它接受参数,我不需要创建一个对象来获得类型,因为我可以直接将类型传递给这个函数。在我的例子中,由于我在另一个类中预定义了类型,我简单地将代码更改为:
object myCollection = null;
MethodInfo method = typeof(Helpers).
GetMethod("ConvertCsvDataToCollection");
MethodInfo generic = method.MakeGenericMethod(
myClassInfo.CollectionType,
myClassInfo.ObjectType
);
myCollection = generic.Invoke(null, new object[] { csvData });
myClassInfo包含2个类型类型的属性,我在运行时根据传递给构造函数的枚举值设置,并将为我提供相关类型,然后在MakeGenericMethod中使用。
再次感谢你强调这个@Bevan。