动态铸造?

时间:2009-09-17 07:07:24

标签: c# dynamic casting

我需要一种方法将对象强制转换为编译时不知道的类型。

类似的东西:

object obj;

public (type of obj) Obj
{
    get
    {
        return obj
    }
    set
    {
        obj = (type of obj)value;
    }
}

唯一知道的是obj是一种值类型。

我怀疑这样的事情是可能的。只是检查某人是否有巧妙的方法。

5 个答案:

答案 0 :(得分:6)

这在C#3.0中是不可能的,但是如果你可以定义一个所有对象实现的公共接口,你可以转换为。

在C#4.0中,我们将获得允许我们进行Duck Typing的dynamic关键字。

答案 1 :(得分:4)

这样的演员阵容实际上不会做任何事情,因为你在后面分配一个带有更宽松类型的变量。您最好的方法取决于您在“强制转换”它之后要对值类型执行的操作。

选项包括:

  • 反射
  • C#4.0 dynamic输入。
  • 基于变量类型的简单switchif .. else
如果您在编译时对类型一无所知,那么使用泛型类的

编辑实际上并不能解决您的问题,但您的示例并未说明您的类的实际用法,因此它可能是我误解了你的意图。像这样的东西可能实际上是你正在寻找的东西:

class MyClass<T> where T: struct
{
    T obj;

    public T Obj
    {
        get { return obj; }
        set { obj = value; }
    }
}

MyClass<int> test = new MyClass<int>();
test.Obj = 1;

实际的类型定义现在在您的类之外,作为泛型类型参数。严格地说,类型仍然是静态的,因为它在编译时是已知的。

答案 2 :(得分:4)

嗯,你可以用泛型来做到这一点:

public class IAcceptValueTypes<T> where T: struct

private T obj;

public T Obj
{
    get { return obj; }
    set { obj = value; }
}

通用约束where T: struct会将可接受的类型限制为值类型。

答案 3 :(得分:1)

你为什么需要这种铸造?

  1. 如果类型数量有限,您可以实现您的财产的通用版本。
  2. 您可以使用反射来理解传递对象的类型并强制转换为此类型。

答案 4 :(得分:1)

我目前没有在我面前试用Visual Studio,但你为什么不抬头看看:

  • 的GetType
  • Convert.ChangeType