. net反射强制转换为精确类型
本文关键字:类型 转换 反射 net | 更新日期: 2023-09-27 18:02:02
我想知道是否有一种方法可以使用system转换为精确类型。反射,这样您就可以避免执行显式强制转换,例如
(System.DateTime)
例如假设我有一个字典,如
Dictionary<propName, Dictionary<object, Type>>
和假设我迭代一个对象道具列表
foreach (var prop in @object.GetType().GetProperties())
{
object propValue = propInfo.GetValue(@object, null);
string propName = propInfo.Name;
Dictionary<object, Type> typeDictionary = new Dictionary<object, Type>();
Type propType = propInfo.GetValue(@object, null).GetType();
typeDictionary[propValue ] = propType ;
propsDictionary[propInfo.Name] = propValue;
}
我想做一些类似的事情,使用像
这样的东西转换为精确类型// this part is only for guidelines
// it should obtain the exact Type
// ... but it returns a string of that type Namespace.Type
Type exactType = Dictionary[enumOfPropName][someValue]
// this part should know the exact type Int32 for example and cast to exact
var propX = (exactType)someValue
是否有任何方法做这样的事情,如果有,我怎么能得到这个?此外,大部分代码只是一个指导方针,一个想法,所以请不要太当真。谢谢大家。
- 对象类型是运行时信息。 变量的类型是编译时信息。编译时在运行时之前。
这里的结论是,不可能有与任意对象实例的确切类型匹配的静态类型变量,因为这样做将需要目前还不可用的信息。
作为一种变通方法,可以考虑将变量设置为dynamic
,然后看看可以从那里做些什么。
一旦你知道类型:
var x = 22;
var type = typeof(Int32);
var propX = Convert.ChangeType(x, type);
或者在你的情况下:
object thing = 32;
var lookup = new Dictionary<string, Dictionary<object, Type>>();
lookup.Add("Test", new Dictionary<object, Type>());
lookup["Test"].Add(thing, typeof(Int32));
var propX = Convert.ChangeType(thing, lookup["Test"][thing]);
使用此方法的注意事项:ChangeType:要转换成功,value必须实现IConvertible接口…
如果我理解你的问题,你想转换一个对象(在一个object
类型的变量)到它的实际类型,你已经提取了彻底的反射。如果是这样,我相信Convert.ChangeType
会对你有所帮助。你可以这样使用:
var propX = Convert.ChangeType(someValue, exactType);
I am pretty casting要求您在编译时知道类型,这就是为什么您不能使用Type
变量进行类型转换(因为它只在运行时知道)。
您需要在目标类上实现您想要的类型的隐式操作符
class Program
{
static void Main(string[] args)
{
var a = new A() { property = "someValue" };
string obj = (string)teste;
}
}
class A
{
public string property { get; set; }
public static implicit operator string(A t)
{
if (t == null)
return null;
return t.property;
}
}