如何使用C#和Reflection来获取Implemented Class类型而不是Interface类型

时间:2013-04-16 03:11:12

标签: c# reflection interface

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

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

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

    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模板生成控制器,视图和ViewModel(使用automapper和Kendo UI)。所以如果要清理一些东西,那很好。所以欢迎任何让我感动的建议。

1 个答案:

答案 0 :(得分: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)。 最好只使用具体类型声明属性