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扩展了我的答案,展示了如何动态解析泛型方法。非常好,谢谢,我甚至没有想到用这样的反射调用第三方方法