我正在使用MVC3,C#,Razor,.NET4,EF5,SQL Server 2008.
我需要找出域对象上属性的类型,特别是它是ICollection,即导航属性还是简单的POCO类型,即int,string等。
基本上我是从View映射到Domain对象,我需要排除导航属性(ICollection)。我正在使用Value Injector,我可以编写一个自定义注入器来忽略ICollection。
我相信有“TypeOf”功能。
所以我的伪逻辑将是:
Match if not(typeOf(ICollection))
非常感谢。
编辑:
尝试了第一个解决方案,但无法让它发挥作用。示例代码如下。一切都归于真实。我希望isCollection1和2为假,3和4为真。
思想?
bool isCollection2 = stdorg.Id is System.Collections.IEnumerable;
bool isCollection3 = stdorg.StdLibraryItems is System.Collections.IEnumerable;
EDIT2:
这对我有用:
bool IsCollection = (stdorg.StdLibraryItems.GetType().Name == "EntityCollection`1")
Value Injector实际上要求我使用:
bool IsCollection = (stdorg.StdLibraryItems.GetType().Name == "ICollection`1")
这是一种享受。对于那些感兴趣的人,Value Injector有一个匹配的例程,并且这个条件确定匹配是否返回true,如果是,它将Target属性值设置为Source Property Value的值。
答案 0 :(得分:1)
如果您可以使用点语法访问属性或对象,则可以使用is运算符。
var obj = new List<string>();
bool collection = obj is System.Collections.IEnumerable; // true since IEnumerable is the base interface for collections in .NET
如果您使用Type.GetMembers
等方法通过反射访问媒体资源,则可以使用t.GetInterface("System.Collections.IEnumerable")
。
其中t是该实例的类型。如果该类型未实现所述接口,则方法GetInterface(string)
返回null。
答案 1 :(得分:1)
他是一种通用类型解决方案,也可以解决其他属性问题。 特别是如果某些东西可以为空。
foreach (var propertyInfo in typeof (T).GetProperties()) { //<< You know about typeof T already
var propType = UnderLyingType(propInfo);
//if( decide if collection?){}
}
public Type UnderLyingType(PropertyInfo propertyInfo) {
return Nullable.GetUnderlyingType(propertyInfo.PropertyType)
?? propertyInfo.PropertyType;
}
您可能还想查看PropInfo中可用的信息。