如何找到属性的类型,特别是简单类型和集合类型之间?

时间:2013-08-11 17:42:06

标签: asp.net-mvc asp.net-mvc-3 entity-framework entity-framework-4 entity-framework-5

我正在使用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的值。

2 个答案:

答案 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中可用的信息。