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

我想动态转换数据类型。

我的代码:

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获取值。 此阅读器始终返回字符串值。 我将全局使用此方法。

那么,你需要的是所谓的类型推断

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

 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 GetConverter(T example) { return (x) => Convert(x); } static T Convert(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); } 

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

 Userid = new System.Guid(value); 

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

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

Guid的情况下,它会有很大的不同,因为没有真正的转换。 看,用string构建一个Guid必须这样做:

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

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