C#子类型的实例不是在反射中创建的?

时间:2014-09-24 12:44:43

标签: c# reflection

我想要实例化完整的课程。

  1. 我有要实例化的类的类型。
  2. Activator.createInstance(type)我创建了实例。
  3. 我搜索了这个实例的所有字段。
  4. 我有一个在另一个程序集中定义的字段,所以我加载它并实例化它。
  5. 我再次对该类中的字段(嵌套)
  6. 重复步骤3和4
  7. 我正在创建各种类型的实例
  8.  //in a1.dll
        class class1
        {
           class2 var1;
           //some Method
        }
    
        //in a2.dll
        class class2
        {
           class3 var2;
           //some Method
        }
    
        //in a3.dll
        class class3
        {
           //some Method
        }
    

    我必须创建整个class1类型的实例。

1 个答案:

答案 0 :(得分:0)

所以你想创建一个包含其他类的类。

以下是您可以做的事情:

  • 通过Activator
  • 创建一个类实例
  • 对于当前实例中的每个属性和字段类型,通过调用您所在的方法创建子实例,并将子实例分配给当前实例字段或属性

以下代码可以帮助您开始处理此问题,但请仔细阅读,以及其下的非常重要的要点

public class A
{
    public B MyBProperty { get; set; }
    public C MyCField;
}

public class B
{
    public C MyCField;
}

public class C
{
}

public class Creator
{ 
    static MethodInfo mi;

    static Creator()
    {
        mi = typeof(Creator).GetMethod("Create");
    }

    public T Create<T>()
    {
            var createdType = Activator.CreateInstance<T>();

        // assign all properties
        foreach (var p in typeof(T).GetProperties())
        {
            try
            {
                var mig = mi.MakeGenericMethod(p.PropertyType);
                p.SetValue(createdType, mig.Invoke(this, null));
            }
            catch
            {
            }
        }

        // assign all fields
        foreach (var f in typeof(T).GetFields())
        {
            try
            {
                var mig = mi.MakeGenericMethod(f.FieldType);
                f.SetValue(createdType, mig.Invoke(this, null));
            }
            catch
            {
            }
        }

        return createdType;
    }
}

// to use it:
var c = new Creator();
var a = c.Create<A>(); // should be instantiated

现在有一些非常重要的要点

  • 这段代码可以帮助你了解如何开始,这是非常天真的
  • 它没有检查无限循环!!!
  • 它不会缓存任何创建机制
  • 如果无法创建您的类,则会失败,例如因为它没有无参数构造函数
  • 无声地失败
  • 不要使用它!

有很多方法可以自动创建对象,这段代码是一个可靠的例子,只是一个起点:如果你想了解更多,我建议你从{{读取代码3}}或任何其他自动对象创建框架。我希望它能帮助你找到正确的方向。