我有一个基类“元素”,并从中派生了另外两个类,“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”类型?抱歉非技术英语。
答案 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)
应该可以做到这一点。