Преобразовать объект перечисления в эквивалентный объект перечисления - PullRequest
1 голос
/ 09 апреля 2020

Здравствуйте! Я использую отражение для преобразования типа объекта A в эквивалентный тип объекта A2, эти два типа имеют одинаковые свойства и атрибуты, а для преобразования я использую следующую процедуру:

public static void CopyObject<T>(object sourceObject, ref T destObject) 
{
    //  If either the source, or destination is null, return
    if (sourceObject == null || destObject == null)
        return;

    //  Get the type of each object
    Type sourceType = sourceObject.GetType();
    Type targetType = destObject.GetType();

    //  Loop through the source properties
    foreach (PropertyInfo p in sourceType.GetProperties())
    {
        //  Get the matching property in the destination object
        PropertyInfo targetObj = targetType.GetProperty(p.Name);
        //  If there is none, skip
        if (targetObj == null)
        {
           // targetObj = Activator.CreateInstance(targetType); 
            continue;
        }

        //  Set the value in the destination
        targetObj.SetValue(destObject, p.GetValue(sourceObject, null), null);
    }
}

This отлично работает для простых объектов с эквивалентными именами свойств, но проблема в том, что объекты soruce и taget имеют любой тип ENUM.

Эта строка:

 foreach (PropertyInfo p in sourceType.GetProperties())

Не возвращает объект PropertyInfo, поэтому l oop не запускается и изменения не вносятся, нет ошибок, просто не работает.

Таким образом, в любом случае необходимо преобразовать с помощью отражения один объект перечисляемого типа A в объект перечислимого типа А1 Я знаю, что что-то не имеет никакого смысла, но мне нужно это, чтобы адаптировать мой код и существовать в приложении, у которого нет исходного кода.

Идея такова:

Наличие двух enums

public enum A
{
   vallue1=0,
   value2=1, 
   value3=2
}

public enum A1
{
   vallue1=0,
   value2=1, 
   value3=2
}

и два объекта этих типов перечислений:

A prop1 {get;set;}
A1 prop2 {get;set;}

Мне нужно два получить значение перечисления prop1 и установить это значение в prop2, получая эквивалентное значение в второе перечисление, в общем случае c (поэтому я использую рефлексию)?

Заранее спасибо!

1 Ответ

1 голос
/ 09 апреля 2020

Если вам нужно разыграть по значению, вы можете сделать:

if (sourceType.IsEnum && targetType.IsEnum)
{
    destObject = (T)sourceObject;
    return;
}

Или по имени:

if (sourceType.IsEnum && targetType.IsEnum)
{
    destObject = (T)Enum.Parse(typeof(T), sourceObject.ToString());
    return;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...