-4

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

对不起这个令人作呕的问题(例如:

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


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

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

4

4 回答 4

4

根据您的实际意思,您应该使用vardynamic

var关键字只是让编译器负责决定您实际使用的类型。如果您要分配的数据在运行时是真正动态的,那么它对您没有多大好处。您应该主要将var其视为语法糖(即使有时它可能是非常非常有用的糖) - 即它只是节省您的打字时间。

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

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

于 2012-07-26T07:40:51.040 回答
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只用于隐式类型的局部变量。特别是,您不能将其应用于字段。

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

于 2012-07-26T07:41:04.733 回答
2

我知道这必须使用关键字 var

不,那不是var。有 3 件事让我想到起作用:

  • object; 可以存储任何东西,但需要反射来做任何有用的事情
  • dynamic; 对象的特殊情况,编译器执行巫术,以便obj.SomeMethod()(等)在运行时解析
  • 泛型,即类为SomeType<T>,变量类型为T; 通用约束可以T通过声明它必须具有的特性(接口)来使其更有用
于 2012-07-26T07:41:28.730 回答
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);
于 2012-07-26T07:49:11.533 回答