2009-09-17 159 views
3

我需要一种方法将对象转换为编译器时不知道的类型。动态铸造?

是这样的:

object obj; 

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

是唯一知道的是,obj是一个值类型。

我怀疑这样的事情是可能的。只要检查一下是否有人有一个聪明的方法来做到这一点。

+2

泛型?根据T – Gishu 2009-09-17 07:08:56

+0

定义索引器类似的方法我编辑了代码,使其更清楚我想要做什么。 – remdao 2009-09-17 07:11:15

+0

在你的例子中,你的演员阵容在二传手中,而在吸气者中更有意义。 – Thorarin 2009-09-17 08:55:35

回答

6

这在C#3.0中是不可能的,但是如果你可以定义一个所有对象都实现的通用接口,那么你可以对此进行强制转换。

在C#4.0中,我们将获得dynamic关键字,它允许我们进行鸭子打字。

+0

在几个项目中与这样的场景作斗争后,我会说有一个通用的界面可能是最好的方法。 根据类型访问它的功能会更多地在某个阶段有一个开关或某种类型的选择器(为什么不从一开始就进行类型转换?),毕竟,如果它不知道如何知道什么访问一次铸造? 如果这是某种类似插件的exec的一部分,使用反射并访问它的方法和属性,这将消除需要投射的松散耦合。 猜这一切取决于你需要它 – samiq 2009-09-17 07:52:52

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; 

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

4

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

public class IAcceptValueTypes<T> where T: struct 

private T obj; 

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

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

+0

正确的做法! – nawfal 2014-01-18 05:28:13

1

为什么你需要这样的铸造?

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

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

  • 的GetType
  • Convert.ChangeType