从Type的变量中声明参数的类型?

时间:2012-10-25 14:47:32

标签: c#

如何将变量的类型放在方法参数中,因为某个类是由类变量定义的?例如:

class MyClass {
   private Type _type;

   public MyClass(Type type) {
      _type = type;
   }

   public void SomeMethod(_type param) { //... }
   public _type OtherMethod() {}

}

所以,我的想法是,我可以为类中的变量设置动态类型,并使用Type变量作为其他对象的类型。

是否可以在C#中执行此操作?

修改

我决定让我的问题更清楚,并解释我为什么要求这样的功能。我试过Generics。然而,泛型的问题是,每当我引用该类的对象时,我必须声明类的类型,如:MyClass<TSomeType> param

在我的方案中,我的List<MyClass> dataList包含MyClass。如果我在MyClass上有一个泛型,那么dataList必须是List<MyClass<TSomeType>>。在这种情况下,我被卡住了,因为列表只能包含MyClass<TSomeType>。一旦我宣布了全班的类型,我就不能拥有其他类型的类型。这就是为什么我想知道是否有一种更传统的方式来声明一个Type,就像我可以将一个类的类型存储到一个变量,然后像类类型一样使用这个变量。

2 个答案:

答案 0 :(得分:5)

  

是否可以在C#中执行此操作?

没有。编译器对MyClass做了什么?它无法知道方法调用是否有效。

可以使用泛型来代替:

class MyClass<T>
{
    public void SomeMethod(T param) { ... }
    public T OtherMethod() { ... }
}

此时,当编译器看到MyClass<string>时,它知道SomeMethod("foo")有效,但SomeMethod(10)不是。

如果确实在执行时间之前不知道类型,那么您也可以使用object

class MyClass
{
    public void SomeMethod(object param) { ... }
    public object OtherMethod() { ... }
}

...如果你真的想要,可能会对Type进行执行时检查。

答案 1 :(得分:2)

我认为你在这里寻找的是Generics - 这将为你提供你所追求的以及编译时类型安全的好处。

public MyClass<T>
{
    public void SomeMethod(T param)
    {
        ...
    }

    public T OtherMethod()
    {
        ...
    }
}

<强>用法

var intClass = new MyClass<int>();
intClass.SomeMethod("10"); // would cause a compile error
intClass.SomeMethod(10); // would compile ok
string result = intClass.OtherMethod(); // would cause a compile error    
int result = intClass.OtherMethod(); // would compile ok