【发布时间】:2020-08-07 08:13:06
【问题描述】:
我有这个代码:
Type leftType = workItem[LeftFieldName].GetType();
然后我想声明一个该类型的变量:
leftType someVar;
这可能吗?
【问题讨论】:
-
不,你没有。仔细想想,你会发现这样的变量完全没有用。
-
你想要完成什么?可能还有另一种方法可以解决您的实际问题。
我有这个代码:
Type leftType = workItem[LeftFieldName].GetType();
然后我想声明一个该类型的变量:
leftType someVar;
这可能吗?
【问题讨论】:
您可以执行类似的操作并将它们转换为已知接口。
var someVar = Convert.ChangeType(someOriginalValue, workItem[LeftFieldName].GetType());
var someVar = Activator.CreateInstance(workItem[LeftFieldName].GetType());
如果您将 var 替换为 dynamic(并且您使用的是 .Net 4),您可以在 someVar 对象上调用您期望的方法。如果它们不存在,你只会得到一个 MissingMethodException。
【讨论】:
var someVar = workItem[LeftFieldName],但 它并不安全,因为您可以意外改变(如果是引用类型)原始对象的值。我建议您坚持Austin 的回答 (var someVar = Activator.CreateInstance(workItem[LeftFieldName].GetType());) 中描述的策略
这是不可能的。
变量类型是编译时的概念;声明一个直到运行时才知道类型的变量是没有意义的。
你不能对变量做任何事情,因为你不知道它是什么类型。
您可能正在寻找 dynamic 关键字。
【讨论】:
Form 对象,我添加了我想要使用类似 new EditField<MemberAddress>(e => e.AddressId) 进行编辑的字段。我使用MemberExpression 创建正确的表单元素,但有些类型需要默认值。 EG long 具有默认值 0,DateTime 具有默认日期。我没有创建大量 If 语句来为每种类型设置正确的默认值,而是像 Austin 解释的那样简单地创建了一个 Instance 并使用 .ToString() 来获取正确的默认值。
不,这是不可能的。变量的类型必须在编译时知道。
您可以声明object 类型的变量,它将能够存储任何数据类型。
【讨论】:
object x = Activator.CreateInstance(Type) 将让您创建对象。在那之后,你是否可以用它做很多事情,我不确定。
【讨论】:
你不能这样做。
您可以为 .Net 4 使用 dynamic 类型,但对于早期的 .Net 版本,唯一适合的类型是 object,您需要稍后通过再次测试 .GetType() 来手动转换您分配给 object 类型的变量。
【讨论】:
var someVar; 更改为var someVar = ,然后将其分配给隐式类型someVar。这绕过了输入someVar,这就是OP所追求的。就像不必弄清楚 db 列类型一样。
GetType 在运行时进行评估,而非dynamic 声明在编译时进行(它确实比这更具体,是的),所以不是。即使var 也会要求您为其分配一个明确类型的值。
【讨论】: