【问题标题】:Is there any way to assign to a variable by a Type object in C#?有没有办法通过 C# 中的 Type 对象分配给变量?
【发布时间】:2011-03-16 19:14:02
【问题描述】:

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

    class Element
    {...}

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

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

我已经创建了一个“元素”类的实例,“E1”。下面的方法应该获取一个整数“ElType”和“E1”作为其参数,并将“E1”作为“固体”或“流体”元素(或稍后将介绍的任何其他“元素”)分配给“E1”。我的意思是,如果“IElType == 2”,则应将“E1”分配给“Solid”类型,如果“IElType == 3”,则应将“Fluid”类型分配给...。我想让我的同事能够推导出尽可能多的类,来自“Element”类,并确保只有通过为“ElemType”设置适当的值,程序才能识别它们的“Element”。

    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”类型?抱歉,非技术性英语。

【问题讨论】:

  • 为什么在没有返回值的情况下使用out参数?

标签: c# class types


【解决方案1】:

Activator.CreateInstance(t1) 应该可以解决问题。

【讨论】:

    【解决方案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;
            }
          }
        }
    }
    

    【讨论】:

    • 我使用 Visual Studio 2005 和 .NET 2.0。我应该升级到更高版本。因为我找不到 CreatInstanceOf 方法,并且通过使用 CreateInstance 我得到了将对象隐式转换为 Element 的错误。
    • 没有名为 CreateInstanceOf 的方法。只有 Activator.CreateInstance()。
    • 不,您不需要更新。我已经更正了错误并删除了 var,以便它现在应该在 2.0 下编译。 (您指出的错误不会在任何版本中编译)遗憾的是我没有可以测试的编译器,但我认为这次我做对了
    • 我稍微更改了代码,因为如果您只是在寻找一个成员(或字段),则不需要遍历所有成员(或字段)。我没有测试返回的 FieldInfo 是否与 null 不同,您可能想要这样做
    猜你喜欢
    • 2013-07-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-27
    • 1970-01-01
    • 1970-01-01
    • 2021-08-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多