Как я могу получить имя свойства ICollection <> из ссылки на содержащийся тип? - PullRequest
1 голос
/ 04 сентября 2011

У меня есть ссылки на типы A и B, но я хочу имя ICollection<A>, которое является свойством B.Как я могу получить имя коллекции "BunchOfX", если у меня есть только два типа?

public class X
{
}

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

Мне нужно что-то, что может дать мне имя свойства "BunchOfX", когда у меня есть только ссылки на типы A иB. Допустим, 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", когда он находится в <>

решении, основанном на ответах Джона и Ани

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

1 Ответ

4 голосов
/ 04 сентября 2011

Вам нужно будет просмотреть свойства с отражением.Самый простой способ сделать это - использовать LINQ:

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