Отражение может использоваться для инстанцирования базового класса объектов свойства?

Как это:

    public class remoteStatusCounts : RemoteStatus 
{
    public int statusCount;

    public remoteStatusCounts(RemoteStatus r)
    {
        Type t = r.GetType();
        foreach (PropertyInfo p in t.GetProperties())
        {
            this.property(p) = p.GetValue(); //example pseudocode
        }
    }
}

Пример немного прост (это от API Jira - RemoteStatus имеет 4 свойства), но предположите, что базовый класс имел 30 свойств. Я не хочу вручную устанавливать все те значения, особенно если мой наследованный класс только имеет несколько дополнительных свойств.

Отражение, кажется, намекает на ответ.

Я видел при Использовании наследования в конструкторе (Publix X (): y) то, что я могу вызвать конструктора базового класса (я думаю? исправьте меня, если я неправ), но мой базовый класс не имеет конструктора - он получен из jira wsdl

        public remoteStatusCounts(RemoteStatus r) : base(r) { //do stuff }

редактирование я могу вообразить 2 допустимых решения: тот, обрисованный в общих чертах выше, и своего рода ключевое слово как this.baseClass это имеет type(baseclass) и управляемый как таковой, действуя как своего рода указатель на this. Так, this.baseClass.name = "Johnny" была бы та же самая вещь как this.name = "Johnny"

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

        public remoteStatusCounts(RemoteStatus r) {
            RemoteStatus mBase = r;
            //do work
        }

edit2 Этим вопросом является больше осуществления мысли, чем practial один - в моих целях, я, возможно, так же, как легко сделал это: (принятие моего "базового класса" может сделать копии),

    public class remoteStatusCounts 
{
    public int statusCount;
    public RemoteStatus rStatus;
    public remoteStatusCounts(RemoteStatus r)
    {
        rStatus = r;
        statusCount = getStatusCount();
    }
}

5
задан Community 23 May 2017 в 10:32
поделиться

2 ответа

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

Вы можете отфильтровать его с помощью Type.GetProperties(BindingsFlags) перегрузки.

Примечание: Возможно, вам следует рассмотреть возможность генерации кода (T4 - это идея, поскольку он поставляется с vs 2008/2010), поскольку отражение может иметь последствия во время выполнения, например, скорость выполнения. С помощью генерации кода вы можете легко справиться с этой утомительной работой и получить то же время выполнения и т.д., что и при ручном вводе.

Example:

//extension method somewhere
public static T Cast<T>(this object o)
{
    return (T)o;
}

public remoteStatusCounts(RemoteStatus r)
{
    Type typeR = r.GetType();
    Type typeThis = this.GetType();

    foreach (PropertyInfo p in typeR.GetProperties())
    {
        PropertyInfo thisProperty = typeThis.GetProperty(p.Name);

        MethodInfo castMethod = typeof(ExMethods).GetMethod("Cast").MakeGenericMethod(p.PropertyType);
        var castedObject = castMethod.Invoke(null, new object[] { p.GetValue(r, null) });
        thisProperty.SetValue(this, castedObject, null);
    }
}
1
ответ дан 15 December 2019 в 06:15
поделиться

Попробуйте AutoMapper .

2
ответ дан 15 December 2019 в 06:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: