Динамический возврат объекта из метода, который принимает только тип класса - PullRequest
0 голосов
/ 23 января 2019

Я работаю на .NET Framework 3.5 У меня есть требование создать метод в C #, который может принимать один из 5 типов классов и динамически генерировать объект, используя тип класса, который я передаю в метод. Таким образом, в основном есть 2 входа для этого метода. Один - это тип класса, а другой - объект данных, которым мне нужно заполнить объект. Как только метод вызывается, он должен автоматически создать объект того типа класса, который я отправил, и заполнить поля объектом данных, который я отправил. Я попытался использовать метод createinstance System.reflection и получил объект с нужным классом, однако я поражен тем, что мне нужно заполнить поля имеющимся у меня объектом данных. Любая помощь очень ценится.

Edit : `public class DataInput
{
    public string field1 { get; set; }
    public string field2 { get; set; }
    public string field3 { get; set; }
    public string field4 { get; set; }
    public DateTime field5 { get; set; }
    public DateTime field6 { get; set; }


}
My 5 classes look like this :

public class Class1
{
    public string field1;
    public string field2;
    public string field3;
    public string field4;
    public DateTime field5;
}

public class Class2
{
    public string field1;
    public string field2;
    public string field3;

}

public class Class3
{
    public int field1;
    public string field2;
    public string field3;

}

public class Class4
{
    public int field1;
    public string field2;
    public string field3;
    public DateTime field4;


}
public class Class5
{
    public int field1;
    public DateTime field2;
    public string field3;

}

public void Convert(DataInput ratCommon, Type type1)
{
    var type = Type.GetType(type1.AssemblyQualifiedName.ToString());
    if (type != null)
    {
        Object obj = Activator.CreateInstance(type);  //This  creates an instance with type I passed, but I am struck here

    }
}
I combined @Fabjan answer and @striplingwarrior answer and got the result. I can't thank you enough....

Ответы [ 2 ]

0 голосов
/ 23 января 2019

Это похоже на хороший вариант использования для AutoMapper .

Начните с инициализации отображений между вашими классами.

Mapper.Initialize(cfg => {
    cfg.CreateMap<DataInput, Class1>();
    cfg.CreateMap<DataInput, Class2>();
    // etc.
});

Примечание. Возможно, вам понадобится создать несколько пользовательских отображений , таких как проекции , поскольку похоже, что типы полей не всегда совпадают.

Затем вы можете использовать методы Mapper.Map:

public object Convert(DataInput ratCommon, Type type1) => Mapper.Map(foo, typeof(DataInput), type1);

Или, если во время компиляции известен type1, вы можете получить безопасность типов с помощью обобщений:

public T Convert<T>(DataInput ratCommon) => Mapper.Map<T>(foo);
0 голосов
/ 23 января 2019

Я поражен тем, что мне нужно заполнить поля имеющимся у меня объектом данных.

Это потому, что компилятор не знает, какой тип возвращается, поэтомуон не может связываться со свойствами типа runtime .

В зависимости от того, как вы получаете данные для объекта времени выполнения, у вас есть несколько вариантов:

  • Отражение - найти свойства с именами, которые вы хотите установить, используя отражение
  • dynamic - используйте dynamic, чтобы отложить все привязки prpoerty до времени выполнения (в основном то же, что и выше, но позволяя компилятору генерировать необходимый код отражения)
  • Десериализация - использовать существующие библиотеки для десериализации из XML,JSON и др.
...