我的问题涉及此代码:
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
中投射对象。
提前致谢。
答案 0 :(得分:0)
存储类型是多余的,因为每个对象本身已经存储了类型信息。
您可以显式地转换结果或定义类型,这里是后者:
list ObserverBoardInterface* ObserverList;
你可以在任何对象上使用GetType(),所以如果你有一组未知对象,你可以在运行时找出它们的类型并采取相应的行动。
答案 1 :(得分:0)
我想我知道错误在哪里。如果我有一个带有签名的方法,需要例如一个int
,然后编译器无法知道对象是否已被强制转换为int
,如果我所做的只是将一个对象强制转换为某个Type
(即使Type
是指int
)。对我有用的是创建仅MyMethod
的{{1}}副本,然后在该方法中转换为子类型,然后使用子类型签名运行objects
。