在c#中动态更改数据类型

时间:2013-07-16 12:05:43

标签: c# asp.net

我想动态转换数据类型。

我的代码:

private static void updateValues(SqlDataReader reader)  
{
        USR_AddressItem item = new USR_AddressItem();
        Type ConvertNewType;
        ConvertNewType = Type.GetType(item.UserId.GetType().Name);
        item.UserId = (ConvertNewType)(reader[UserDAL.USR_Address.FieldNames.UserId]);

}

此处数据类型仅为动态。因为我想在运行时为该变量赋值。我会从SqlDataReader获得价值。此阅读器始终返回字符串值。我将全局使用此方法。

3 个答案:

答案 0 :(得分:4)

在你展示的例子中,简单地说:

Userid = new System.Guid(value);

因为Guid的构造函数接受一个字符串来创建对象。

也就是说,除非您尝试做其他事情,否则请澄清您的问题!

答案 1 :(得分:4)

嗯,您需要的是类型推断

您不需要事先知道数据类型,让运行时动态解决它,如下所示:

private static void updateValues(SqlDataReader reader)  
{
    USR_AddressItem item = new USR_AddressItem();
    item.UserId = GetConverter(item.UserId)(reader[UserDAL.USR_Address.FieldNames.UserId]);
}

我的魔力就在这里:

static Func<string, T>  GetConverter<T>(T example)      
{
    return (x) => Convert<T>(x); 
}


static T Convert<T>(string val)
{
        Type destiny = typeof(T);

        // See if we can cast           
        try
        {
            return (T)(object)val;
        }
        catch { }

        // See if we can parse
        try
        {
            return (T)destiny.InvokeMember("Parse", System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.InvokeMethod | System.Reflection.BindingFlags.Public, null, null, new object[] { val });
        }
        catch { }

        // See if we can convert
        try
        {
            Type convertType = typeof(Convert);
            return (T)convertType.InvokeMember("To" + destiny.Name, System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.InvokeMethod | System.Reflection.BindingFlags.Public, null, null, new object[] { val });
        }
        catch { }

        // Give up
        return default(T);
    }

答案 2 :(得分:1)

如果是Guid,它会有很大不同,因为没有真正的转化。请参阅,建立一个Guid string必须这样做:

var guid = new Guid("DAABED91-39AC-4805-9015-1B03E4B5706A");

当然,您可以使用Reflection,但确定哪种构造函数用于没有真正转换的类型将是一个非常复杂的算法。 < / p>

但是,对于许多其他类型,你可以考虑这样的事情:

// would generate something like ToInt32...
var methodName = string.Format("To{0}", t.Name.Split('.').Last());

var methodInfo = Convert.GetType().GetMethod(methodName);
if (methodInfo == null) { return default(t); }

var val = methodInfo.Invoke(null, new object[] { valToConvert });

注意:此代码未经测试。这是一个指导,我认为它非常接近,但你可能需要按摩一下。