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

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

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

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.

 4imble07 янв. 2011 г., 18:36
Да, я думаю, это то, что я имел в виду (ссылочный тип), не был уверен в терминологии для этого случая.
 Security Hound07 янв. 2011 г., 18:37
Все эти свойства являются объектами. Вам нужно провести некоторое исследование того, что C # определяет как объект.
 4imble07 янв. 2011 г., 18:42
Переписано, спасибо за разъяснения.
 BoltClock♦07 янв. 2011 г., 18:33
Вы имеете в виду, если это ссылочный тип?
 LukeH07 янв. 2011 г., 18:33
И да,Id, IsActive а такжеClient все свойстваProgrammeClient.

Ответы на вопрос(5)

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

Client.GetType().IsClass

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

foreach(var p in ProgrammeClient.GetType().GetProperties())
{
     if(p.IsClass) Console.WriteLine("Found a class");
}
 nawfal13 мая 2013 г., 14:03
Тебе нужноp.PropertyType.IsClass на самом деле, ответ thecoop.
 4imble07 янв. 2011 г., 18:49
Большое спасибо за это и извините за неправильное использование терминологии.
Решение Вопроса

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

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

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

 4imble07 янв. 2011 г., 18:47
Хорошо, похоже, это не такой простой вопрос, как я надеялся. Я создам новый вопрос позже сегодня вечером, объясняя, почему я хочу обнаружить это и для чего. Большое спасибо.

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

foreach (PropertyInfo pi in typeof(Client).GetProperties()) {
    if (pi.PropertyType.IsClass) {
        // reference type
        // DoMyFunkyStuff
    }
}
 Bertie24 мая 2017 г., 17:17
Тип строки будет зарегистрирован как класс.

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

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

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

Ваш ответ на вопрос