我有这样的类型:
public class TypeValue
{
public Type Type { get; private set; }
public object Value { get; private set; }
}
所以我可以这样做:
TypeValue tv = ...
int count = (tv.Type) tv.Value;
但是编译器给了我这个错误:
类型或命名空间名称'tv'可以 找不到(你错过了使用 指令或程序集引用?)
我如何实现这一目标?
答案 0 :(得分:3)
没有。编译器如何能够确定编译时“类型”指的是什么类型? “类型”对象与执行强制转换时使用的类型名称不同。例如,这不起作用:
// "typeof" returns a "Type" object.
string foo = (typeof(string))SomeObj;
你将无法使用静态演员,但你可以偷偷摸摸地做这件事using reflection at runtime.
答案 1 :(得分:3)
您显示的作业无法按照您想要的方式完成。 赋值运算符两侧的对象类型必须相等(或右手对象必须是继承左手对象类型的类型)。
所以,你不能这样做
Type1 obj1 = new Type1();
Type type = typeof(Type1);
Type2 obj2 = (type)obj1;
您可以通过使您的类具有通用性或使用通用方法获取值来实现您想要的功能。 E.g。
public class TypeValue
{
public Type Type { get; private set; }
public object Value { get; set; }
public T GetValueAs<T>()
{
if (Value == null)
return default(T);
return (T)Value;
}
}
TypeValue a = new TypeValue();
a.Value = 1;
int b = a.GetValueAs<int>();
甚至更好
public class TypeValue<T>
{
public Type Type { get { return typeof(T); } }
public T Value { get; set; }
}
TypeValue<int> a = new TypeValue<int>();
a.Value = 1;
int b = a.Value;
Type c = a.Type;
答案 2 :(得分:1)
你应该这样做:
TypeValue tv = ...
int count = (int) tv.Value;
如果您在编译时知道类型(在这种情况下您知道count
是int
),那么请参阅tv.Type
无论如何。这有助于说明为什么这没有逻辑意义,因此是不可能的。
答案 3 :(得分:1)
从System.Type
和System.Object
获取强类型变量是不可能的。有时您可以像这样使您的类具有通用性:
public class TypeValue<T>
{
public T Value { get; private set; }
}