从仅接受类类型的方法中动态返回对象

时间:2019-01-23 18:26:55

标签: c# system.reflection

我正在使用.NET Framework 3.5 我需要在C#中创建一个方法,该方法可以接受5种类型中的一种,并使用传递给该方法的类类型动态生成对象。因此,此方法基本上有2个输入。一种是类的类型,另一种是我需要用来填充对象的数据对象。 调用该方法后,它应自动创建一个我发送的类类型的对象,并用我发送的数据对象填充字段。 我尝试使用System.reflection的createinstance,并获得了具有所需类的对象,但是,我感到震惊的是,我必须用我拥有的数据对象填充字段。非常感谢您的帮助。

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 :(得分:0)

  

我感到震惊的是,我必须用我拥有的数据对象填充字段。

这是因为编译器不知道将返回哪种类型,因此它无法绑定到 runtime 类型的属性。

根据如何获取运行时对象的数据,有一些选择:

  • 反射-查找要使用反射设置名称的属性
  • dynamic-使用dynamic将所有特权绑定推迟到运行时(基本上与上面相同,但是让编译器生成必要的反射代码)
  • 反序列化-使用现有库从XML,JSON等反序列化。

答案 1 :(得分:0)

这似乎是AutoMapper的一个好用例。

首先初始化类之间的映射。

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

注意:您可能需要创建一些自定义映射like projections,因为看起来您的字段类型并不总是匹配。

然后,您可以利用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);