动态类型转换?

3

我需要一种方法将一个对象转换为编译时未知的类型。

类似于这样:

object obj;

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

唯一已知的是obj是一个值类型。 我怀疑这样的事情是否可能。只是检查看看是否有人有巧妙的方法来做到这一点。

2
泛型?用T来定义索引器方法。 - Gishu
我编辑了代码,以使我的意图更加清晰。 - remdao
在你的例子中,你的强制类型转换应该放在getter中,这样更合理。 - Thorarin
5个回答

6
在C# 3.0中这是不可能的,但是如果你能定义一个所有对象都实现的通用接口,你就可以将其转换为该接口。在C# 4.0中,我们将获得“dynamic”关键字,它允许我们进行鸭子类型转换。

在多个项目中经历过这样的情况后,我认为拥有一个共同的接口可能是最好的选择。根据类型访问其功能将更倾向于在某个阶段具有开关或某种选择器(那么为什么不从一开始就进行类型转换呢?),毕竟,如果不知道转换后要访问什么,怎么办?如果这是某种类似插件的执行方式,使用反射并通过它访问其方法和属性将消除转换的需要,因此松散耦合。我猜这一切取决于你需要它做什么。 - samiq

4
这样的转换实际上并没有起到作用,因为你将其分配回一个具有较宽松类型的变量。你最好的方法取决于在“转换”之后你想要对值类型进行什么操作。
选项包括:
- 反射 - C# 4.0 的动态类型。 - 基于变量类型的简单的开关或if..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;

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


4

好的,您可以使用泛型来实现此操作:

public class IAcceptValueTypes<T> where T: struct

private T obj;

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

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

1

你为什么需要这种类型的转换?

  1. 如果类型数量有限,您可以实现属性的通用版本。
  2. 您可以使用反射来了解传递对象的类型并将其转换为该类型。

1

我目前没有Visual Studio在我面前尝试,但你为什么不查一下:

  • GetType
  • Convert.ChangeType

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接