Return 从只接受 class 类型的方法中动态生成的对象

Return an object dynamically from a method that accepts only type of class

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

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....

I am struck at a point where I have to populate the fields with the data object that I have.

那是因为编译器不知道返回的是什么类型,所以它无法绑定到 runtime 类型的属性。

根据获取运行时对象数据的方式,您有一些选择:

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

这看起来是 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);