当目标类型为动态时,在运行时将对象列表转换为接口类型列表

时间:2015-08-02 07:19:43

标签: c# interface casting runtime

我有这样的方法:

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 ???

1 个答案:

答案 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
    }