Подтвердить что ты не робот

Обнаружение, если свойство класса является ссылочным типом

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

Возьмите ниже в качестве примера:

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: -
Идентификатор и IsActive являются свойствами, но Клиент является ссылочным типом. Есть ли способ обнаружить это?

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

Добавление

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

Client.GetType().IsClass

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

foreach(var p in ProgrammeClient.GetType().GetProperties())
{
     if(p.PropertyType.IsClass) Console.WriteLine("Found a class");
}

Ответ 3

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

foreach (PropertyInfo pi in typeof(Client).GetProperties()) {
    if (pi.PropertyType.IsClass) {
        // reference type
        // DoMyFunkyStuff
    }
}

Ответ 4

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

bool ContainsOnlyValues() { 
    return typeof(ProgrammeClient).GetProperties().All(x => x.PropertyType.IsValueType);
}

Ответ 5

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

Id.GetType().IsValueType

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