2

更新:我的“问题”是由于对我使用反射的类的错误假设造成的。我在下面的问题是荒谬的,因为它没有那样做。但是我把它留在这里,以防代码片段有用。

我正在使用反射从位于单独程序集中的已编译类中生成视图模型。除了我从编译的程序集中返回的类型显示一个接口而不是作为接口的具体实现的类之外,大多数一切都在工作。

例如,在编译的程序集中,我定义了一个属性,如:

    public List<String> strings { get; set; }

使用反射,我已经能够生成如下所示的相应属性(和完整的类):

    public ICollection<String> strings { get; set; }

我得到了这样做的类型(为简洁起见,严重剪断):

    Type value = <...some passed in type...>
    String types = String.Join(",", value.GetGenericArguments().Select(t => t.Name).ToArray());

    String.Format("{0}<{1}>", value.GetGenericTypeDefinition(), types);

有没有办法使用 Type 对象来确定返回的接口使用了什么具体实现?我猜没有,但我想我会问。

如果没有办法,除非有更好的建议,否则我正在考虑使用“最有可能的实现”查找给定接口(即您传入“ICollection”,我将其转换为具体的“列表”)? ??

不一定需要“完美”的解决方案,因为它用于使用 T4 模板生成控制器、视图和视图模型(带有 automapper 和 Kendo UI)。因此,如果有一些事情要清理,那很好。因此,欢迎任何让我接近的建议。

4

1 回答 1

0

好吧,我玩了一点反射,这就是我带来的:

    //Initial list with ints
    var items = new List<int> {1, 2, 3, 4, 5};
    //ICollection<int> reference
    var collectionOfItems = (ICollection<int>) items;

    //...

    //First of, get collection Type object
    var collectionType = collectionOfItems.GetType();
    //Next, let's grab generic arguments
    var genericArguments = collectionType.GetGenericArguments();

    //For each generic candidate type we need to construct it with collection's generic arguments
    var candidate = typeof(List<>).MakeGenericType(genericArguments);

    //Perform check
    if (collectionType.IsAssignableFrom(candidate))
        Console.WriteLine("Can be casted to {0}", candidate);
    else
        Console.WriteLine("Cannot be cated to {0}", candidate);

是的,反射是可能的,但是您需要检查很多可能的类型(有些不是 BCL 类型也可以实现ICollection)。最好只用具体类型声明属性

于 2013-04-16T07:29:21.070 回答