【发布时间】:2013-04-08 07:57:46
【问题描述】:
更新:我的“问题”是由于对我使用反射的类的错误假设造成的。我在下面的问题是荒谬的,因为它没有那样做。但是我把它留在这里,以防代码 sn-p 有用。
我正在使用反射从位于单独程序集中的已编译类中生成视图模型。除了我从已编译程序集返回的类型显示一个接口而不是作为接口的具体实现的类之外,大多数一切都正常工作。
例如,在已编译的程序集中,我定义了如下属性:
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 模板生成控制器、视图和视图模型(带有自动映射器和 Kendo UI)。因此,如果有一些事情要清理,那很好。因此,欢迎任何让我亲近的建议。
【问题讨论】:
-
您可以随时检查可能的嫌疑人。例如,
if (value is List<String>)... -
看了大概 5 个小时并发布了这个问题后,我意识到我是一个 白痴。我假设我的
List是ICollection,因为List实现了ICollection,而且我几乎总是在场景中使用List。事实证明,在我正在使用的课程中,我将其声明为ICollection而不是List,因此是“错误的方式”。当我发现这一点时,我翻转了我的类型,它按预期出现了,我可以将模型重新创建为视图模型,一切都很好。太糟糕了,我没有早点看实际的实现。 :(
标签: c# reflection interface