2017-01-23 61 views
-2

我的问题的列表类型包括此代码:C#泛型方法的返回类型从

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,然后将其发送一个错误,它无法转换对象整数,浮点,等等

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

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

不过,我想这是因为我只需要设置类型的对象一次,然后只用MyTypes自动投在MyObjects的对象。

在此先感谢。

+3

调用方法仍然应该知道在每个索引处存储哪种类型。你用这个代码试图达到什么目的? –

+0

那么,为什么不只是投射到“T”呢? (是的,这是合法的,转换将在运行时发生。)您是否期望需要检测'T'和'MyTypes [index]'之间的不匹配? –

+0

即使你可以在你的方法中进行转换,调用代码仍然必须知道要作为通用参数传递的类型。但是,如果你的调用代码知道实际的类型,我无法看到将返回的对象转换为该特定类型的问题 – HimBromBeere

回答

0

我想我知道错误在哪里。如果我有一个签名需要的方法,例如一个int,那么编译器无法知道如果我已经完成的对象已经投射到某个Type(即使Type引用int),该对象是否已经投射到int。对我而言,创建MyMethod副本只需要objects,然后在该方法中将其转换为子类型,然后使用子类型签名运行MyMethod

0

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

你可以把结果或显式定义的类型,这里是后者:

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 
    } 
} 

您可以在任何物体上使用的GetType(),所以如果你有不明物体的集合,你可以只图在运行时输出它们的类型并相应地执行。