Определение, является ли свойство класса ссылочным типом - PullRequest
25 голосов
/ 07 января 2011

Можно ли при просмотре свойств класса определить, является ли какое-либо из них ссылочным типом.

В качестве примера приведен ниже:

public class Client
{
   public int Id { get; set; }
   public string Name { get; set; }
}

public class ProgrammeClient
{
    public int Id { get; set; }
    public bool IsActive { get; set; }
    public IClient Client { get; set; }
}

ProgrammeClient: -
Id и IsActive являются свойствами, но Client является ссылочным типом.Есть ли способ обнаружить это?

Большое спасибо, Кохан.

Приложение

Причина, по которой я спрашиваю: я использую маппер, который проверяет типы, которые раньшесопоставление имен свойств и копирование значений.Я надеюсь обнаружить классы, переопределить сопоставление типов и просто скопировать свойства классов, если совпадение типов THEY.

Ответы [ 5 ]

41 голосов
/ 07 января 2011

Похоже, вы , возможно, пытаетесь обнаружить разницу между типом значения и ссылочным типом.Вы можете выяснить это с помощью Type.IsValueType ... но имейте в виду, что типы значений также могут легко иметь свойства.(Например, DateTime.) Кроме того, некоторые типы, которые вы можете рассматривать как "не объекты", являются ссылочными типами - string является основным примером.

Другой вариант - использовать Type.IsPrimitive - это , что вы ищете?Если это так, вы должны знать, что decimal, DateTime и string являются не примитивными типами.

Если вы можете описать точно , что делаетвведите «объект» в своем мышлении (или, скорее, каким-либо образом семантическую разницу в том, что вы пытаетесь сделать с вашим типом).Я подозреваю, что в настоящее время у вас нет четкого набора критериев - подход к этим критериям может также прояснить и другие аспекты вашей текущей задачи.

14 голосов
/ 07 января 2011

Вы можете использовать небольшое отражение, чтобы увидеть, является ли свойство типом значения или типом класса. Класс - это, вероятно, то, что вы подразумеваете под «объектом». Все типы в .NET являются производными от типа объекта.

Client.GetType().IsClass

Или вы можете просмотреть все свойства и посмотреть, какие из них составные

foreach(var p in ProgrammeClient.GetType().GetProperties())
{
     if(p.IsClass) Console.WriteLine("Found a class");
}
2 голосов
/ 07 января 2011

Вы можете перечислить свойства через Reflection и проверить их:

bool ContainsOnlyValues() { 
    return typeof(ProgrammeClient).GetProperties().All(x => x.PropertyType.IsValueType);
}
2 голосов
/ 07 января 2011

Все свойства в вашем примере возвращают объекты, так как все является объектом в .NET; int и bool являются объектами. Если вы имеете в виду ссылочный тип, а не типы значений, то вы можете сделать следующее:

foreach (PropertyInfo pi in typeof(Client).GetProperties()) {
    if (pi.PropertyType.IsClass) {
        // reference type
        // DoMyFunkyStuff
    }
}
1 голос
/ 07 января 2011

Свойство Type.IsvalueType может раскрыть это.

Id.GetType().IsValueType

Это будет True для Id, false для класса

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...