是否有任何方法可以通过C#中的Type对象分配给变量?

时间:2010-07-16 06:32:13

标签: c# class types

我有一个基类“元素”,并从中派生了另外两个类,“Solid”和“Fluid”。

    class Element
    {...}

    class Solid : Element
    {
        public const int ElemType = 2;
        ...
    }

    class Fluid : Element
    {
        public const int ElemType = 3;
        ...
    }

我制作了一个“元素”类的实例,“E1”。假设以下方法获得整数“ElType”和“E1”作为其参数,并将“E1”分配为“实体”或“流体”元素(或稍后将介绍的任何其他“元素”)。我的意思是,如果“IElType == 2”,则应将“E1”分配为“实体”类型,如果“IElType == 3”,则应指定“流体”类型......我想让同事们得出从“Element”类中可以选择多个类,并确保仅通过为“ElemType”设置适当的值,程序将识别它们的“元素”。

    private static void ElemInitializer(int ElType, out Element E1)
    {
        E1 = new Element();
        Type T1 = typeof(Element);
        Type[] T2 = Assembly.GetAssembly(T1).GetTypes();
        List<Type> T3=new List<Type>();
        foreach (Type t1 in T2)
        {
            if (t1.IsSubclassOf(T1))
            {
                MemberInfo[] M1 = t1.GetMembers();
                foreach (MemberInfo m1 in M1)
                {
                    if (m1.Name == "ElemType")
                    {
                        FieldInfo F1 = t1.GetField("ElemType");
                        int int1 = (int)F1.GetValue(t1);
                        if (int1 == ElType)
                        {
                            // Here I want to assign to E1 as t1 type. Such as:
                            // E1 = new t1(); Of course this is wrong!
                        }
                    }
                }
            }
        }
    }

问题是,我希望“E1”的类型为“t1”,但是不可能通过这样的简单代码来实现:

E1 = new t1(); //Of course this is wrong!

有没有办法将“E1”指定为“t1”类型?抱歉非技术英语。

2 个答案:

答案 0 :(得分:2)

首先,使用更好的命名约定,它可以更容易地帮助您,从长远来看它也将帮助您自己。下面的代码应该这样做

private static void ElemInitializer(int ElType, out Element E1)
{
    E1 = new Element();
    Type typeofElement = typeof(Element);
    Type[] assemblyTypes = Assembly.GetAssembly(T1).GetTypes();
    foreach (Type elementType in assemblyTypes )
    {
      if (elementType.IsSubclassOf(typeofElement))
      {
        FieldInfo field = elementType.GetField("ElemType");
        int elementId = (int)field.GetValue(elementType);
        if (elementId == ElType)
        {
           E1 = (Element)Activator.CreateInstance(elementType);
           return;
        }
      }
    }
}

答案 1 :(得分:0)

Activator.CreateInstance(t1)应该可以做到这一点。