C# .NET反射转换为精确类型

C# .NET反射转换为精确类型,c#,.net,reflection,casting,C#,.net,Reflection,Casting,我想知道是否有一种方法可以使用system.reflection强制转换为精确类型,从而避免执行显式转换,例如 (System.DateTime) 比如说 假设我有一本字典,比如 Dictionary<propName, Dictionary<object, Type>> 有没有办法做到这一点?如果有,我怎样才能做到? 此外,这段代码的大部分只是一个指导原则,一个想法,所以请不要认为这是可能的。 谢谢大家。一旦您了解了类型: var x = 22; var type

我想知道是否有一种方法可以使用system.reflection强制转换为精确类型,从而避免执行显式转换,例如

(System.DateTime)
比如说

假设我有一本字典,比如

Dictionary<propName, Dictionary<object, Type>>
有没有办法做到这一点?如果有,我怎样才能做到? 此外,这段代码的大部分只是一个指导原则,一个想法,所以请不要认为这是可能的。
谢谢大家。

一旦您了解了类型:

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]);
object thing=32;
var lookup=newdictionary();
添加(“Test”,newdictionary());
查找[“测试”]。添加(thing,typeof(Int32));
var propX=Convert.ChangeType(thing,lookup[“Test”][thing]);

此方法的注意事项:

您需要在目标类上实现一个隐式运算符,使其成为所需的类型

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;
    }
}
  • 对象的类型是运行时信息
  • 变量的类型是编译时信息
  • 编译时间在运行时之前
这里的结论是,不可能有一个静态类型的变量与任意对象实例的确切类型相匹配,因为这样做需要的信息还不可用


作为一个解决方案,考虑变量[<代码>动态< /C> >,看看从那里可以做什么。

< P>如果我理解你的问题,你想把一个对象(在<代码>对象< /代码>类型变量)转换成它的实际类型,你已经提取了彻底的反射。如果是这样的话,我相信Convert.ChangeType会对您有所帮助。您可以这样使用它:

var propX = Convert.ChangeType(someValue, exactType);

I am pretty casting要求您在编译时知道类型,这就是为什么不能使用
类型
变量进行强制转换(因为它只在运行时已知)。

强制转换需要静态已知的类型进行强制转换。您不需要进行动态强制转换,因为运行时知道运行时类型
someValue
。如果您不知道静态类型,您可以使用
propX
做什么?我认为这不包括随机类型的属性列表,据我所知,这是所要求的。这是一个有限的解决方案。如果OP使用的自定义类型不实现IConvertible,此解决方案将无法工作:同意,我只是按照OP说的做。您可以编辑帖子,向OP发送此规范的信号。;)
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;
    }
}
var propX = Convert.ChangeType(someValue, exactType);