. 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

是否有任何方法做这样的事情,如果有,我怎么能得到这个?此外,大部分代码只是一个指导方针,一个想法,所以请不要太当真。谢谢大家。

. net反射强制转换为精确类型

  • 对象类型是运行时信息。
  • 变量的类型是编译时信息。编译时在运行时之前。

这里的结论是,不可能有与任意对象实例的确切类型匹配的静态类型变量,因为这样做将需要目前还不可用的信息。

作为一种变通方法,可以考虑将变量设置为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;
    }
}