C# 将IEnumerable转换为IEnumerable<;T>;深思熟虑
所以,我需要调用一个第三方方法,它有这样一个签名C# 将IEnumerable转换为IEnumerable<;T>;深思熟虑,c#,reflection,ienumerable,C#,Reflection,Ienumerable,所以,我需要调用一个第三方方法,它有这样一个签名 void DoWork(IEnumerable items, Type type) { //In here I have to call ThirdPartyMethod<T>(IEnumerable<T> items); } public static class External { public static void ThirdPartyMethod<T>(IEnumerable<
void DoWork(IEnumerable items, Type type)
{
//In here I have to call ThirdPartyMethod<T>(IEnumerable<T> items);
}
public static class External
{
public static void ThirdPartyMethod<T>(IEnumerable<T> items)
{
Console.WriteLine(typeof(T).Name);
}
}
ThirdPartyMethod(IEnumerable items)
我的问题是在编译时我不知道对象的类型
在编译时我有这个
IEnumerable myObject;
Type typeOfEnumerableIHave;
Sooo..反射能帮我吗
为了简单起见,假设我有这样一个方法
void DoWork(IEnumerable items, Type type)
{
//In here I have to call ThirdPartyMethod<T>(IEnumerable<T> items);
}
public static class External
{
public static void ThirdPartyMethod<T>(IEnumerable<T> items)
{
Console.WriteLine(typeof(T).Name);
}
}
void DoWork(IEnumerable项,类型)
{
//在这里,我不得不称之为第三方方法(IEnumerable items);
}
因为您有IEnumerable myObject代码>和签名,如第三方方法(IEnumerable items)
您可以使用Cast()
:
如果你有以下几点
Type theType = typeof(int);
IEnumerable myObject = new object[0];
您可以在运行时获得泛型方法ThirdPartyMethod
和Cast
var targetMethod = typeof(External).GetMethod("ThirdPartyMethod", BindingFlags.Static | BindingFlags.Public);
var targetGenericMethod = targetMethod.MakeGenericMethod(new Type[] { theType });
var castMethod = typeof(Enumerable).GetMethod("Cast", BindingFlags.Static | BindingFlags.Public);
var caxtGenericMethod = castMethod.MakeGenericMethod(new Type[] { theType });
最后调用该方法:
targetGenericMethod.Invoke(null, new object[] { caxtGenericMethod.Invoke(null, new object[] { myObject }) });
您可以尝试以下方法:
void DoWork(IEnumerable items, Type type)
{
// instance of object you want to call
var thirdPartyObject = new ThirdPartyObject();
// create a list with type "type"
var typeOfList = typeof(List<>).MakeGenericType(type);
// create an instance of the list and set items
// as constructor parameter
var listInstance = Activator.CreateInstance(listOfTypes, items);
// call the 3. party method via reflection, make it generic and
// provide our list instance as parameter
thirdPartyObject.GetType().GetMethod("ThirdPartyMethod")
.MakeGenericMethod(type)
.Invoke(thirdPartyObject, new []{listInstance});
}
void DoWork(IEnumerable项,类型)
{
//要调用的对象的实例
var thirdPartyObject=新的thirdPartyObject();
//创建类型为“type”的列表
var typeOfList=typeof(列表)。MakeGenericType(类型);
//创建列表和集合项的实例
//作为构造函数参数
var listInstance=Activator.CreateInstance(listOfTypes,items);
//通过反射调用3.party方法,使其通用并
//提供我们的列表实例作为参数
thirdPartyObject.GetType().GetMethod(“ThirdPartyMethod”)
.MakeGenericMethod(类型)
.Invoke(第三方对象,新[]{listInstance});
}
代码创建泛型类型“type”的列表实例(通过使用MakeGenericType)。然后将项目元素复制到列表中,并通过relection调用第三方方法(注意“MakeGenericMethod”调用以确保该方法具有与该方法参数相同的类型参数。在哪个上下文中有此IEnumerable myObject;
?您能多显示一点您的代码吗?@BrunoLM我添加了一点,我不确定它是否有用我不知道正确的说法,但我无法访问
,我只有类型sense@KyleGobel扩展了我的答案,展示了如何动态解析泛型方法。非常好,谢谢,我甚至没有想到用这样的反射调用第三方方法