Использование отражения и интерфейса в конструкторе для инициализации в C #

Я разрабатываю сервис для сбора данных из многих удаленных баз данных и компиляции их в главную базу данных. У меня есть интерфейс, который содержит данные, общие для двух баз данных. Интерфейс также служит связующим звеном между моей моделью и ViewModel.

Я хотел бы взять данные из экземпляра RemoteDatabase и поместить все это в экземпляр MasterDatabase.

public interface IInterface
{
    //Common interface properties in both databases
    long PK { get; set; }
    Nullable<long> RUN_ID { get; set; }
    string Recipe_Name { get; set; }
    string Notes { get; set; }
    //Lots more properties from a database
}

class RemoteDatabase : IInterface
{
    //Common interface properties in both databases
    public long PK { get; set; }
    public Nullable<long> RUN_ID { get; set; }
    public string Recipe_Name { get; set; }
    public string Notes { get; set; }
    //Lots more properties from a database
}

class MasterDatabase : IInterface
{
    //Additional properties that Remote Database doesn't have
    public int locationFK { get; set; }

    //Common interface properties from database
    public long PK { get; set; }
    public Nullable<long> RUN_ID { get; set; }
    public string Recipe_Name { get; set; }
    public string Notes { get; set; }
    //Lots more properties from a database

    public MasterDatabase(IInterface iInterface)
    {
        var interfaceProps = typeof(IInterface).GetProperties(BindingFlags.Public | BindingFlags.Instance);

        foreach (PropertyInfo p in interfaceProps)
        {
            p.Name;
        }
    }
}

Я попытался просто использовать объект, но это привело к недопустимому исключению приведения, которое я понимаю (хотя у них есть общие предки, это не значит, что они могут использовать dog == animal, fish == animal, но dog! = Fish, но я хочу получить общие свойства, определенные в IAnimal).

Поскольку я не мог выполнить приведение, я хотел бы использовать отражение, чтобы при обновлении интерфейса все новые объекты в классе MasterDatabase обновлялись автоматически. Я использовал отражение, чтобы получить все свойства из интерфейса, но теперь как мне использовать propertyInfo.name для получения значений в классе MasterDatabase.

Возможно, мне не хватает чего-то очевидного, или есть способ сделать это лучше. Я ценю любую помощь или предложения.

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


person John S.    schedule 16.10.2013    source источник
comment
Вы думали об автомаппере? visualstudiomagazine.com/articles/2012/02/ 01 /   -  person Colin    schedule 16.10.2013


Ответы (1)


Вам нужно вызвать SetValue объекта PropertyInfo, используя this в качестве цели. Передаваемое вами значение должно быть получено с помощью соответствующего GetValue вызова параметра конструктора:

foreach (PropertyInfo p in interfaceProps)
{
    p.SetValue(this, p.GetValue(iInterface, null), null);
}
person rossipedia    schedule 16.10.2013
comment
Спасибо за помощь. Теперь я понимаю следующий вопрос. Если у меня есть IEnumerable ‹RemoteDatabase› и я хочу поместить его в IEnumberable ‹MasterDatabase›, следует ли мне использовать foreach? Подойдет ли мне неявный преобразователь? Спасибо за помощь, многие из этих тем для меня совсем новые. Я бы поддержал ваш ответ, но, к сожалению, у меня пока недостаточно репутации, поэтому спасибо! - person John S.; 16.10.2013
comment
Да, в этом сценарии вы захотите использовать простой цикл for each и вручную сопоставить каждый элемент. Честно говоря, вам лучше использовать что-то вроде AutoMapper. - person rossipedia; 17.10.2013