Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/apache-flex/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#泛型方法从类型列表返回类型_C#_Generics_Return Type - Fatal编程技术网

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