我有这样的方法:
private static List<object> ConvertList<T>(IEnumerable<T> inputList, Type type)
{
var innerType = type.GenericTypeArguments.First(); //innerType is like: MyInterface
List<object> result1 = inputList.Select(item => Convert.ChangeType(item, innerType));
return result1;
}
上述方法runtime
:
inputList
参数是:List<MyClass>
之类的内容。type
参数是:type of List<MyInterface>
之类的内容。MyClass的定义如下:
public class MyClass: MyInterface
{
...
}
上述方法的返回值为: List<object>
这个方法适合我,但我需要它的返回值基于它的type
参数。例如,我希望方法返回值类似于:List<MyInterface>
所以我改变了我的方法:
private static dynamic ConvertList<T>(IEnumerable<T> inputList, Type type)
{
var innerType = type.GenericTypeArguments.First(); //innerType is like: MyInterface
List<object> result1 = inputList.Select(item => Convert.ChangeType(item, innerType));
dynamic result2= Convert.ChangeType(result1, type);
return result2;
}
但现在我收到以下错误:
对象必须实现IConvertible
在这行代码中:
dynamic result2= Convert.ChangeType(result1, type);
我知道错误原因,但我不知道如何解决此问题。
EDIT1:
我认为我的方式不正确,我应该编写一些代码来将以下代码value type
更改为女性类型我想在运行时基于type
参数:
var result1 = inputList.Select(item => Convert.ChangeType(item, innerType));
现在的问题是,当result1
时,如何将上述代码的类型(list<object>
)从list<MyInterface>
更改或转换为list<MyInterface>
信息位于 type
参数内,type
参数指向interface
列表,而不是class
???
答案 0 :(得分:1)
我认为你应该将result1包装到实现Iconvertible的对象(通过使用合成来扩展System.Collections.Generic.IEnumerable),所以它将是这样的:
private static dynamic ConvertList<T>(IEnumerable<T> inputList, Type type)
{
var innerType = type.GenericTypeArguments.First(); //innerType is like: MyInterface
Wrapper result1 = new Wrapper();
result1.Property = inputList.Select(item => Convert.ChangeType(item, innerType));
dynamic result2 = Convert.ChangeType(result1, type);
return result2;
}
public class Wrapper : IConvertible
{
public System.Collections.Generic.IEnumerable<object> Property { get; set; }
//implement here all the methods required by Iconvertable
}