C#泛型方法从类型列表返回类型
我的问题涉及以下代码:C#泛型方法从类型列表返回类型,c#,generics,return-type,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 };
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
}
}
但是,我希望我只需要设置一次对象的类型,然后使用MyTypes
在MyObjects
中自动强制转换对象
提前感谢。存储类型是多余的,因为每个对象本身已经存储了类型信息 您可以强制转换结果或显式定义类型,以下是后者:
public static class MyStaticClass {
public class MyClass {
public List<object> MyObjects;
public MyClass() {
MyObjects = new List<object>(){ 1, 0.5F };
}
public T GetObject<T>(int index) {
var item = MyObjects[index];
if(typeof(T) != item.GetType())
throw new InvalidCastException();
return (T) item;
}
}
public static void Main() {
MyClass myClass = new MyClass();
int arg1 = myClass.GetObject<int>(0);
float arg2 = myClass.GetObject<float>(1);
MyMethod(arg1, arg2);
}
public static void MyMethod(int arg1, float arg2) {
// Does something
}
}
公共静态类MyStaticClass{
公共类MyClass{
公开列表对象;
公共MyClass(){
MyObjects=newlist(){1,0.5F};
}
公共T GetObject(int索引){
var项目=MyObject[索引];
if(typeof(T)!=item.GetType()
抛出新的InvalidCastException();
退货(T)项;
}
}
公共静态void Main(){
MyClass MyClass=新的MyClass();
int arg1=myClass.GetObject(0);
float arg2=myClass.GetObject(1);
MyMethod(arg1、arg2);
}
公共静态void MyMethod(int arg1,float arg2){
//做点什么
}
}
您可以在任何对象上使用GetType(),因此,如果您有一组未知对象,您可以在运行时找出它们的类型,并采取相应的行动。我想我知道错误在哪里。如果我有一个需要签名的方法,例如
int
,那么如果我所做的只是将一个对象强制转换为某个类型
(即使类型
指的是int
),编译器就无法知道该对象是否被强制转换为int
)。对我来说,有效的方法是创建一个只接受对象的MyMethod
副本,然后在该方法中强制转换到子类型,然后使用子类型签名运行MyMethod
。调用方法仍然应该知道每个索引中存储的类型。你想用这段代码实现什么?那么,为什么仅仅对t
进行强制转换还不够呢?(是的,这是合法的,转换将在运行时进行。)您是否希望检测T
和MyTypes[index]
之间的不匹配?即使您可以在方法中强制转换,调用代码仍然必须知道要作为泛型参数传递的类型。但是,如果调用代码知道实际类型,我看不出将返回的对象强制转换为该特定类型的问题,为什么不简单地使用int arg1=myClass.Foo;浮动arg2=myClass.Bar
使用索引和强制转换而不是属性名有什么好处吗?@Marijn您使用的是局部变量,应该在编译代码之前定义局部变量。在实例化MyClass之前,这将发生很长时间。如何知道需要多少局部变量?
public static class MyStaticClass {
public class MyClass {
public List<object> MyObjects;
public MyClass() {
MyObjects = new List<object>(){ 1, 0.5F };
}
public T GetObject<T>(int index) {
var item = MyObjects[index];
if(typeof(T) != item.GetType())
throw new InvalidCastException();
return (T) item;
}
}
public static void Main() {
MyClass myClass = new MyClass();
int arg1 = myClass.GetObject<int>(0);
float arg2 = myClass.GetObject<float>(1);
MyMethod(arg1, arg2);
}
public static void MyMethod(int arg1, float arg2) {
// Does something
}
}