C# 如何将对象值强制转换为类型值?

C# 如何将对象值强制转换为类型值?,c#,.net,casting,C#,.net,Casting,我有这样一种类型: public class TypeValue { public Type Type { get; private set; } public object Value { get; private set; } } public class TypeValue<T> { public T Value { get; private set; } } 所以我可以这样做: TypeValue tv = ... int coun

我有这样一种类型:

public class TypeValue
{
    public Type Type { get; private set; }
    public object Value { get; private set; }
}
public class TypeValue<T> 
{     
    public T Value { get; private set; } 
} 
所以我可以这样做:

TypeValue tv = ...
int count = (tv.Type) tv.Value;
但是编译器给了我这个错误:

类型或命名空间名称“tv”可能不正确 找不到(您是否缺少一个用户 指令或组件引用?)


如何实现这一点?

否。编译器如何在编译时确定“type”所指的类型?“type”对象与执行强制转换时使用的类型的名称不同。例如,这也不起作用:

// "typeof" returns a "Type" object.
string foo = (typeof(string))SomeObj;
你不能使用静态施法,但你可以偷偷摸摸地这样做

你应该做:

TypeValue tv = ...
int count = (int) tv.Value;
请参阅,在编译时知道类型的情况下(在本例中,您知道
count
int
),那么无论如何都没有必要引用
tv.type
。这有助于说明为什么这没有逻辑意义,因此不可能。

不可能从
System.Type
System.Object
获取强类型变量。有时,您可以将类设置为通用类,如下所示:

public class TypeValue
{
    public Type Type { get; private set; }
    public object Value { get; private set; }
}
public class TypeValue<T> 
{     
    public T Value { get; private set; } 
} 
公共类类型值
{     
公共T值{get;私有集;}
} 

您显示的作业无法按您希望的方式完成。 赋值运算符两侧的对象类型必须相等(或者右侧对象的类型必须继承左侧对象类型)

所以,你不能这样做

Type1 obj1 = new Type1();
Type type = typeof(Type1);
Type2 obj2 = (type)obj1;
您可以通过将类设置为泛型,或者使用泛型方法获取值来实现所需的功能。 例如

公共类类型值
{
公共类型类型{get;private set;}
公共对象值{get;set;}
公共价值
{
如果(值==null)
返回默认值(T);
返回(T)值;
}
}
TypeValue a=新的TypeValue();
a、 数值=1;
int b=a.GetValueAs();
甚至更好

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;
公共类类型值
{
公共类型类型{get{return typeof(T);}
公共T值{get;set;}
}
TypeValue a=新的TypeValue();
a、 数值=1;
int b=a.值;
c型=a型;

那么如何进行运行时强制转换呢?事实上,这是一个糟糕的例子。发布了另一个。根据Joan试图对强制类型值执行的操作,使用C#
动态
也可能是一个选项。如果使用动态,是否只将对象值更改为动态值?是。它查看LHS:因此,
string text=tv.Value
将尝试转换为字符串,并且
int count=tv.Value
将尝试强制转换为int。并且您可以捕获RuntimeBinderException以处理tv.Value类型不正确的情况。注意:这是一个简单的CAST:如果目标是字符串,它不会尝试将字符串解析成整数,或者调用toString(),也不会考虑转换操作符。谢谢,但是为什么?Type不是关键字,对吗?在您的示例中,您知道“count”是int,因为您刚刚声明了它。同意这一点。我必须考虑一下,但我可能不需要这样的演员阵容。虽然我仍然很惊讶我不能做上面的事情。例如,我如何存储“int”以便将其放入上面的代码中?我想那是不可能的。因为如果“(type)value”使用的是实际的System.type值,那么它仍然可以工作,因为它在编译时是已知的,不是吗?关键是
count
的类型总是已知的,即使
tv.value
的类型不是。因此,您可以使用静态强制转换。如果您甚至不知道
count
的类型,那么整个情况并不适用,因为您实际上无法对对象执行任何操作,除非将其传递给其他人。。。当类型被假定时,谁将最终执行演员阵容。你是对的。我只是想保存类型值,这样就可以像我上面发布的那样使用它,但我想这没有意义。第二个解决方案是+1。第一个不是解决方案,他没有类型
int
。他需要从TypeValue.Type属性动态获取它。