0

我正在使用 MVC3、C#、Razor、.NET4、EF5、SQL Server 2008。

我需要找出域对象上的属性类型,特别是它是 ICollection 即导航属性还是简单的 POCO 类型,即 int、string 等。

基本上我从视图映射到域对象,我需要排除导航属性(ICollection)。我正在使用值注入器,我可以编写一个自定义注入器来忽略 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;

编辑2:

这对我有用:

bool IsCollection = (stdorg.StdLibraryItems.GetType().Name == "EntityCollection`1")

Value Injector 实际上要求我使用:

bool IsCollection = (stdorg.StdLibraryItems.GetType().Name == "ICollection`1")

这是一种享受。对于那些感兴趣的人,Value Injector 有一个匹配例程,并将此条件放入确定匹配是否返回 true,如果返回 true,则将 Target 属性值设置为 Source Property Value 的值。

4

2 回答 2

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

于 2013-08-11T18:16:26.647 回答
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。

于 2013-08-11T17:55:50.290 回答