【问题标题】:How can I get the name of an ICollection<> property from a reference to the contained type?如何从对包含类型的引用中获取 ICollection<> 属性的名称?
【发布时间】:2011-11-10 04:18:48
【问题描述】:

我有类型引用 AB,但我想要 ICollection&lt;A&gt; 的名称,它是 B 的属性。如果我只有这两种类型,如何获取集合名称“BunchOfX”?

public class X
{
}

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

当我只有类型引用 A 和 B 时,我需要一些可以给我属性名称“BunchOfX”的东西。假设 A 将引用 ICollection 持有的类型,而 B 将引用 ICollection 的类型 定义于。

真正的密码

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 在

中时给出"type or namespace unknown"

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

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

【问题讨论】:

  • 您很可能必须通过反射来完成,还是您要求特定的代码才能找到它?
  • 您是说您想调用Method(b.BunchOfA) 并且能够让Method 知道它是在一个名为BunchOfA 的属性中传递的吗?
  • @R0MANARMY 我想到了反射,但我完全是 .NET 的初学者 - 特定的代码将是理想的。如果它非常复杂,那么指出正确的方向也会有所帮助。感谢您的回复!
  • @Gabe 我不确定你的意思。但我认为我以错误的方式提出了这个问题,所以我对其进行了编辑。感谢您的回复!

标签: c# .net generics reflection properties


【解决方案1】:

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

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

【讨论】:

  • @Benjamin:不,属性类型将是ICollection&lt;A&gt; - 这就是它的声明内容。从属性返回的 value 的类型将是一些具体的实现,但属性本身的类型是ICollection&lt;A&gt;
  • 谢谢,这是有道理的。我想我把这个问题搞砸了。我只会对这两种类型进行运行时引用。我不会有集合的类型,只有对集合属性旨在保存的类型的引用。我将引用集合打开的类型,以及对集合可以“收集”的类型的引用。我不知道如何更好地问这个问题。那有意义吗?谢谢你的帮助。
  • @Benjamin:那么我认为Where 子句中的谓词应该是:p =&gt; typeof(ICollection&lt;A&gt;).IsAssignableFrom(p.propertyType) 或类似的。或者IEnumerable&lt;A&gt;
  • @Benjamin:查看您的更新,您似乎想用typeof(ICollection&lt;&gt;).MakeGenericType(entityType).IsAssignableFrom(p.propertyType) 替换typeof(..) 位。天知道你为什么要玩这么多弦……
猜你喜欢
  • 2021-12-04
  • 2015-02-15
  • 2020-03-17
  • 1970-01-01
  • 2012-01-08
  • 2012-08-31
  • 2019-05-16
  • 1970-01-01
  • 2010-10-14
相关资源
最近更新 更多