【问题标题】:Declare a variable using a Type variable使用 Type 变量声明变量
【发布时间】:2020-08-07 08:13:06
【问题描述】:

我有这个代码:

Type leftType = workItem[LeftFieldName].GetType();

然后我想声明一个该类型的变量:

leftType someVar;

这可能吗?

【问题讨论】:

  • 不,你没有。仔细想想,你会发现这样的变量完全没有用。
  • 你想要完成什么?可能还有另一种方法可以解决您的实际问题。

标签: c# c#-4.0


【解决方案1】:

您可以执行类似的操作并将它们转换为已知接口。

var someVar = Convert.ChangeType(someOriginalValue, workItem[LeftFieldName].GetType());
var someVar = Activator.CreateInstance(workItem[LeftFieldName].GetType());

如果您将 var 替换为 dynamic(并且您使用的是 .Net 4),您可以在 someVar 对象上调用您期望的方法。如果它们不存在,你只会得到一个 MissingMethodException。

【讨论】:

  • 谢谢!正是我需要的。
  • 这似乎有点工作。这是最好的做事方式吗!?没有另一种(更好的)方法来创建动态类型的变量?
  • @MoheTheDreamy 尽管这是创建变量的最简单的方法是:var someVar = workItem[LeftFieldName],但 它并不安全,因为您可以意外改变(如果是引用类型)原始对象的。我建议您坚持Austin 的回答 (var someVar = Activator.CreateInstance(workItem[LeftFieldName].GetType());) 中描述的策略
  • Activator.CreateInstance 如果没有类型的无参数构造函数,则不起作用,例如“字符串”
【解决方案2】:

这是不可能的。

变量类型是编译时的概念;声明一个直到运行时才知道类型的变量是没有意义的。
你不能对变量做任何事情,因为你不知道它是什么类型。

您可能正在寻找 dynamic 关键字。

【讨论】:

  • 一个可能的用例:在我的 MVC 项目中,我有一个 Form 对象,我添加了我想要使用类似 new EditField<MemberAddress>(e => e.AddressId) 进行编辑的字段。我使用MemberExpression 创建正确的表单元素,但有些类型需要默认值。 EG long 具有默认值 0,DateTime 具有默认日期。我没有创建大量 If 语句来为每种类型设置正确的默认值,而是像 Austin 解释的那样简单地创建了一个 Instance 并使用 .ToString() 来获取正确的默认值。
【解决方案3】:

不,这是不可能的。变量的类型必须在编译时知道。

您可以声明object 类型的变量,它将能够存储任何数据类型。

【讨论】:

    【解决方案4】:

    object x = Activator.CreateInstance(Type) 将让您创建对象。在那之后,你是否可以用它做很多事情,我不确定。

    【讨论】:

    • 这将创建该类型的实例,而不是该类型的变量。
    【解决方案5】:

    你不能这样做。

    您可以为 .Net 4 使用 dynamic 类型,但对于早期的 .Net 版本,唯一适合的类型是 object,您需要稍后通过再次测试 .GetType() 来手动转换您分配给 object 类型的变量。

    阅读:SO link: whats-the-difference-between-dynamicc-4-and-var

    【讨论】:

    • 不确定如何应用。 'var' 的使用在这里无关紧要。
    • 您可能会注意到我将var someVar; 更改为var someVar = ,然后将其分配给隐式类型someVar。这绕过了输入someVar,这就是OP所追求的。就像不必弄清楚 db 列类型一样。
    • 我希望你知道 var 总是会在编译时被解析为特定的类型!
    【解决方案6】:

    GetType 在运行时进行评估,而非dynamic 声明在编译时进行(它确实比这更具体,是的),所以不是。即使var 也会要求您为其分配一个明确类型的值。

    【讨论】:

      猜你喜欢
      • 2014-09-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-29
      相关资源
      最近更新 更多