有没有办法通过C#中的Type对象指定给变量?
我有一个基类“Element”,并从中派生出另外两个类“Solid”和“Fluid” 我制作了一个“Element”类“E1”的实例。下面的方法假定获取整数“ElType”和“E1”作为其参数,并将“E1”指定为“Solid”或“Fluid”元素(或稍后介绍的任何其他“元素”)。我的意思是,如果“IElType==2”,那么“E1”应该被指定为“固体”类型,如果“IElType==3”,那么“流体”类型应该被指定为。。。。我想让我的同事能够从“Element”类派生出他们想要的任意多的类,并确保只有通过为“ElemType”设置适当的值,程序才能识别他们的“Element”有没有办法通过C#中的Type对象指定给变量?,c#,class,types,C#,Class,Types,我有一个基类“Element”,并从中派生出另外两个类“Solid”和“Fluid” 我制作了一个“Element”类“E1”的实例。下面的方法假定获取整数“ElType”和“E1”作为其参数,并将“E1”指定为“Solid”或“Fluid”元素(或稍后介绍的任何其他“元素”)。我的意思是,如果“IElType==2”,那么“E1”应该被指定为“固体”类型,如果“IElType==3”,那么“流体”类型应该被指定为。。。。我想让我的同事能够从“Element”类派生出他们想要的任意多的类,并确保
有没有办法将“E1”指定为“t1”类型?对不起,非技术性英语。应该可以做到这一点。首先,使用更好的命名约定,它可以更容易地帮助您,而且从长远来看也会帮助您自己。下面的代码应该可以做到这一点
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;
}
}
}
}
为什么在没有返回值的情况下使用out参数?我使用visual studio 2005和.NET 2.0。我应该升级到更高版本吗。因为我找不到CreatInstanceOf方法,并且通过使用CreateInstance,我得到了将对象隐式转换为元素的错误。没有名为CreateInstanceOf的方法。只有Activator.CreateInstance()。不需要更新。我已经纠正了错误并删除了var,因此它现在应该在2.0下编译。(您指出的错误在任何版本中都不会编译)很遗憾,我没有一个可以测试的编译器,但我想这次我做对了。我对代码做了一些修改,因为如果您只是在寻找一个,您不需要迭代所有成员(或字段)。我不是在测试返回的FieldInfo beind是否与null不同,您可能想这样做
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 = new t1(); //Of course this is wrong!
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;
}
}
}
}