如何使用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模板。所以,如果有一些东西需要清理,那也没关系。所以任何让我接近的建议都是欢迎的
嗯,我玩了一点反射,这是我得到的:
//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
)。最好使用具体类型声明属性