从C#中的未知类型强制转换

Mah*_*adi 1 c# casting

我有一个对象,其中包含字符串中的值和字段中的原点类型。

class myclass
{
   public string value;
   public Type type;
}
myclass s=new myclass();
s.value = "10";
s.type = typeof(int);
Type tt = s.type;
row.Value[ind]= s[0].value as tt; //i have error here
Run Code Online (Sandbox Code Playgroud)

我如何才能通过该类型转换值。

Man*_*hra 5

基本上,您的方案是要使用存储在变量中的类型进行类型转换。您只能在运行时这样做,如下所示:

    myclass s=new myclass();
    s.value = "10";
    s.type = typeof(int);

    var val = Convert.ChangeType(s.value, s.type);
Run Code Online (Sandbox Code Playgroud)

但是由于转换是在运行时完成的,因此您不能将变量val存储在任何整数集合中,即List<int>,甚至不能int another = val在编译时执行coz,因为类型未知,并且由于相同的明显原因,您将出现编译错误。

在稍微复杂的场景中,如果必须强制转换为a,User-Defined dataType并且想要访问其不同的属性,则不能照原样进行。让我演示一下对您的代码的一些修改:

class myclass
{
    public object value;
    public Type type;
}
Run Code Online (Sandbox Code Playgroud)

并且您还有另一个:

    class myCustomType
    {
        public int Id { get; set; }
    }
Run Code Online (Sandbox Code Playgroud)

你现在做 :

 myclass s = new myclass();
 s.value = new myCustomType() { Id = 5 };
 s.type = typeof(myCustomType);
 var val = Convert.ChangeType(s.value, s.type);
Run Code Online (Sandbox Code Playgroud)

现在,如果这样做val.Id,它将无法编译。您必须使用动态关键字或通过反射来检索它,如下所示:

 var id = val.GetType().GetProperty("Id").GetValue(val);
Run Code Online (Sandbox Code Playgroud)

您可以遍历customType(类)的所有可用属性并检索其值。

通过dynamic关键字检索它,可以直接执行以下操作:

dynamic val = Convert.ChangeType(s.value, s.type);
int id = val.Id;
Run Code Online (Sandbox Code Playgroud)

编译器不会哭。(是的,但是不会有任何智能感知)