从 C# 中的未知类型转换

Cast from unknown type in c#

我有一个对象,它包含字符串中的值和字段中的来源类型。

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

如何按类型转换值。

试试这个:

row.Value[ind] = Convert.ChangeType(s.value, tt);

基本上你的场景是你想用存储在变量中的类型进行类型转换。你只能在运行时这样做:

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

    var val = Convert.ChangeType(s.value, s.type);

但是由于转换是在运行时完成的,你不能将变量 val 存储在任何整数集合中,即 List<int> 甚至你不能 int another = val,因为在编译时,类型不是已知,您将再次遇到编译错误,同样是出于同样明显的原因。

在一个稍微复杂的场景中,如果您必须将类型转换为 User-Defined dataType 并且您想要访问它的不同属性,则不能按原样进行。让我对您的代码进行一些修改来演示:

class myclass
{
    public object value;
    public Type type;
}

你还有一个:

    class myCustomType
    {
        public int Id { get; set; }
    }

现在你可以了 :

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

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

 var id = val.GetType().GetProperty("Id").GetValue(val);

您可以遍历 customType (class) 的所有可用属性并检索它们的值。

通过dynamic关键字检索,直接这样做:

dynamic val = Convert.ChangeType(s.value, s.type);
int id = val.Id;

而且编译器不会哭。 (是的,虽然不会有任何智能感知)