不确定类型的变量

时间:2012-07-26 07:37:59

标签: c#

我有一个包含不确定类型变量的类,必须在运行时重写,我该怎么做?

抱歉这个恶心的问题( 例如:

public class MyClass 
{
     public e_Type TypeValue;
     public (variable of indeterminate type) Value;
}


public enum e_Type
{
    string, int, bool, byte
}

在运行时变量TypeValue应该确定变量Value

的类型

4 个答案:

答案 0 :(得分:4)

根据您的实际含义,您应使用vardynamic

var关键字只是让编译器负责决定您实际使用的是哪种类型。如果您要分配的数据在运行时是真正动态的,它对您没有多大帮助。你应该大多看var作为语法糖(即使它有时可以是非常非常有用的糖) - 也就是说它可以节省你的输入。

dynamic关键字允许您创建一个真正动态的对象,即无论您尝试分配给它,都不会出现编译器或运行时错误。当您尝试调用其上不存在的属性时,运行时错误将在后面发生。这基本上是你告诉编译器“嘿,看,只是不要给我任何关于这个对象的大惊小怪,允许我为它分配任何东西并在其上调用任何东西。如果我搞砸了,这是我的问题,不是你的。

我认为无论何时考虑使用dynamic,您都应该考虑手头的问题,看看它是否能以更好的方式解决(接口,泛型等)。

答案 1 :(得分:2)

在仿制药之后听起来你真的

class Foo<T>
{
    public T Value { get; set; };
}

然后您可以为不同类型创建实例:

Foo<string> x = new Foo<string>();
x.Value = "fred";

Foo<int> y = new Foo<int>();
y.Value = 10;

这仍然是在编译时修复类型 - 但是编译代码时使用类型。

var在这里完全错误 - var仅用于implicitly typed local variables。特别是,您无法将其应用于字段。

可能你想要dynamic,但目前你的问题并不是很清楚。

答案 2 :(得分:2)

  

我知道必须使用关键字var

来完成

不,这不是var所做的。有三件事情会让人想起 的工作:

  • object;可以存储任何东西,但需要反思才能做任何有用的事情
  • dynamic;一个特殊情况的对象,编译器执行voodoo,以便在运行时解析obj.SomeMethod()(等)
  • 泛型,即类为SomeType<T>,变量类型为T;通用约束可以通过声明它必须具有的功能(接口)来使T更加可用

答案 3 :(得分:0)

var的目的是引用任何内容,而不是声明任何内容。反过来了。

一旦利用System.Dynamic.ExpandoObject(仅限C#4!),我就完成了这个,它允许随意添加属性而不声明它们,并且它们将在运行时解析(它类似于PHP如何处理对象和我是它的忠实粉丝。

一个简单的例子:

dynamic myObject = new ExpandoObject();
myObject.myProperty = "You can declare properties on-the-fly inside me !";
Console.WriteLine(myObject.myProperty);