如何使用c#和反射来获得实现类类型而不是接口类型

本文关键字:类型 接口类型 实现 何使用 反射 | 更新日期: 2023-09-27 18:09:35

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

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

例如,在编译后的程序集中,我定义了如下属性:
    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",我将其转换为具体的"List"),除非有更好的建议??

一个"完美"的解决方案并不一定需要,因为这是用来生成控制器,视图和ViewModels(与automapper和Kendo UI)使用T4模板。所以,如果有一些东西需要清理,那也没关系。所以任何让我接近的建议都是欢迎的

如何使用c#和反射来获得实现类类型而不是接口类型

嗯,我玩了一点反射,这是我得到的:

    //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)。最好使用具体类型声明属性