【问题标题】:C# Instance of child Type is not creating in Reflection?子类型的 C# 实例未在反射中创建?
【发布时间】:2014-09-24 12:44:43
【问题描述】:

我想实例化完整的类。

  1. 我有想要实例化的类的类型。
  2. Activator.createInstance(type)我创建了实例。
  3. 我搜索了这个实例的所有字段。
  4. 我有一个在另一个程序集中定义的字段,所以我加载并实例化它。
  5. 对于该类中的字段(嵌套),我再次重复第 3 步和第 4 步
  6. 我正在创建每种类型的实例
 //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 类型的实例。

【问题讨论】:

  • 似乎您的流程已关闭 - 您在哪里卡住了?
  • 问题在哪里??
  • 您遇到异常了吗?我假设,因为你没有问,CreateInstance 正在抛出某种错误。

标签: c# reflection


【解决方案1】:

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

你可以这样做:

  • 通过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

现在介绍一些非常重要的观点

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-29
    • 2010-09-28
    • 1970-01-01
    • 2017-04-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多