如何获取ICollection的名称<>属性来自对包含类型的引用?

时间:2011-09-04 17:15:11

标签: c# .net generics reflection properties

我有类型参考AB,但我希望ICollection<A>的名称是B的属性。如果我只有两种类型,如何获得集合名称“BunchOfX”?

public class X
{
}

public class Y
{
   public virtual ICollection<X> BunchOfX { get; set; }
}

当我所拥有的是类型引用A和B时,我需要一些可以给我属性名称“BunchOfX”的东西。假设A将引用ICollection&lt;&gt;的类型。保持,B将引用ICollection&lt;&gt;的类型定义于。

真实代码

var entityType = Type.GetType(nameSpace + "." + entityTypeName);
var foreignType = Type.GetType(nameSpace + "." + foreignTypeName);
var names = foreignType.GetProperties()
    .Where(p => typeof(ICollection<entityType>).IsAssignableFrom(p.PropertyType))
    .Select(p => p.Name);
var foreignCollectionName = names.FirstOrDefault();

entityType在&lt;&gt;

中时会显示"type or namespace unknown"

基于Jon和Ani的回复的解决方案

var foreignCollectionName = foreignType.GetProperties()
    .Where(p => typeof(ICollection<>)
        .MakeGenericType(entityType)
        .IsAssignableFrom(p.PropertyType))
    .Select(p => p.Name).FirstOrDefault();

1 个答案:

答案 0 :(得分:4)

您需要使用反射查看属性。最简单的方法是使用LINQ:

var names = typeOfB.GetProperties()
                   .Where(p => p.PropertyType == typeof(desiredPropertyType))
                   .Select(p => p.Name);