我有一个包含不确定类型变量的类,必须在运行时重写,我该怎么做?
抱歉这个恶心的问题( 例如:
public class MyClass
{
public e_Type TypeValue;
public (variable of indeterminate type) Value;
}
public enum e_Type
{
string, int, bool, byte
}
在运行时变量TypeValue应该确定变量Value
的类型答案 0 :(得分:4)
根据您的实际含义,您应使用var
或dynamic
。
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);