从类型列表

时间:2017-01-23 11:57:27

标签: c# generics return-type

我的问题涉及此代码:

public static class MyStaticClass {
    public class MyClass {
        public List<object> MyObjects;
        public List<Type> MyTypes;

        public MyClass() {
            MyObjects = new List<object>(){ 1, 0.5F };
            MyTypes = new List<Type>(){ typeof{int), typeof(float) }
        }

        public T GetObject<T>(int index) {
            // Should return an instance of type MyTypes[index], and not object
            return MyObjects[index] as MyTypes[index];
        }
    }

    public static void Main() {
        MyClass myClass = new MyClass();
        int arg1 = myClass.GetObject(0);
        float arg2 = myClass.GetObject(1);
        MyMethod(arg1, arg2);
    }

    public static void MyMethod(int arg1, float arg2) {
        // Does something
    }
}

我希望MyClass存储混合类型列表并且长度可变。我知道这样做的唯一方法是存储List<object>。但是,我想在方法中使用MyClass.MyObjects的值,但如果我只是将值设为object,那么它会发送一个错误,它无法将对象转换为int,float等。

问题在于我知道MyObjects中对象的确切子类型,但我无法找到将T中的MyClass.GetObject设置为MyTypes[index]类型的方法。我找到的唯一解决方案是使用

int arg1 = myClass.MyObjects[0] as int;
float arg2 = myClass.MyObjects[1] as float;

但是,我希望我只需要设置一次对象的类型,然后使用MyTypes自动在MyObjects中投射对象。

提前致谢。

2 个答案:

答案 0 :(得分:0)

存储类型是多余的,因为每个对象本身已经存储了类型信息。

您可以显式地转换结果或定义类型,这里是后者:

list ObserverBoardInterface* ObserverList;

你可以在任何对象上使用GetType(),所以如果你有一组未知对象,你可以在运行时找出它们的类型并采取相应的行动。

答案 1 :(得分:0)

我想我知道错误在哪里。如果我有一个带有签名的方法,需要例如一个int,然后编译器无法知道对象是否已被强制转换为int,如果我所做的只是将一个对象强制转换为某个Type(即使Type是指int)。对我有用的是创建仅MyMethod的{​​{1}}副本,然后在该方法中转换为子类型,然后使用子类型签名运行objects