7

我想动态转换数据类型。

我的代码:

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. 此阅读器始终返回字符串值。我将在全球范围内使用这种方法。

4

3 回答 3

4

在您展示的示例中,只需说:

Userid = new System.Guid(value);

因为 a 的构造函数Guid需要一个字符串来创建对象。

也就是说,除非您尝试做其他事情,在这种情况下,请澄清您的问题!

于 2013-07-16T12:08:14.003 回答
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);
    }
于 2013-07-16T12:43:33.573 回答
1

在 a 的情况下,情况Guid会大不相同,因为没有真正的转换。Guid看,用 a构建 astring必须像这样:

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

你当然可以使用Reflection它,但它会是一个非常复杂的算法来确定为没有真正转换的类型使用什么构造函数。

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

// 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 });

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

于 2013-07-16T12:13:20.887 回答