Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
有没有办法通过C#中的Type对象指定给变量?_C#_Class_Types - Fatal编程技术网

有没有办法通过C#中的Type对象指定给变量?

有没有办法通过C#中的Type对象指定给变量?,c#,class,types,C#,Class,Types,我有一个基类“Element”,并从中派生出另外两个类“Solid”和“Fluid” 我制作了一个“Element”类“E1”的实例。下面的方法假定获取整数“ElType”和“E1”作为其参数,并将“E1”指定为“Solid”或“Fluid”元素(或稍后介绍的任何其他“元素”)。我的意思是,如果“IElType==2”,那么“E1”应该被指定为“固体”类型,如果“IElType==3”,那么“流体”类型应该被指定为。。。。我想让我的同事能够从“Element”类派生出他们想要的任意多的类,并确保

我有一个基类“Element”,并从中派生出另外两个类“Solid”和“Fluid”

我制作了一个“Element”类“E1”的实例。下面的方法假定获取整数“ElType”和“E1”作为其参数,并将“E1”指定为“Solid”或“Fluid”元素(或稍后介绍的任何其他“元素”)。我的意思是,如果“IElType==2”,那么“E1”应该被指定为“固体”类型,如果“IElType==3”,那么“流体”类型应该被指定为。。。。我想让我的同事能够从“Element”类派生出他们想要的任意多的类,并确保只有通过为“ElemType”设置适当的值,程序才能识别他们的“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;
        }
      }
    }
}