Обнаружение, если свойство класса является ссылочным типом
Возможно ли, если посмотреть на свойства класса, чтобы определить, является ли какой-либо из них ссылочным типом.
Возьмите ниже в качестве примера:
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.
Ответы
Ответ 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 для класса