当前位置: 首页 > 编程语言 > C#

如何制作一个通用的类型转换方法分享

时间:2023-04-11 00:58:23 C#

如何制作一个通用的类型转换方法我想做的是:boolConvert(outObjectoutput,Objectsource){//找到输出的类型。//如果可能,将源转换为该类型//将结果存储在输出中。返回成功}可能吗?显然,有一个强大的“if”结构可以工作,但这需要为每种可能的数据类型编写一个if块。即使假设我们将它限制为基元和字符串,它仍然是一大块代码。我在想一些更具反思性的东西。旁白:在浏览api时,我遇到了Convert.IsDBNull()方法,如果(!databasefield.GetType().Equals(DBNull.Value))为什么要以Gd的名义进行转换,这将节省我很多时间?为什么不是DBNull.IsDBNull()?皈依没有圣杯。对于m类型,您需要m*(m-1)个转换例程来涵盖所有排列。对于原始类型,使用Convert.ChangeType如果一个类型可以从原始类型转换为它,它可以实现IConvertable接口并从Convert类使用它。对于其他一切,@BrianRudolfs的回答是最好的。为您需要的每个排列注册显式转换方法。下面是我正在使用的示例,您可以通过注册其他类型转换器来向其中注入其他复杂的转换。publicstaticclassConverter{publicstaticTConvert(objectobj,TdefaultValue){if(obj!=null){if(objisT){return(T)obj;}TypeConverter转换器=TypeDescriptor。GetConverter(类型(T));如果(converter.CanConvertFrom(obj.GetType())){return(T)converter.ConvertFrom(obj);}}返回默认值;一位开发人员编写了这个函数,我们发现它非常有用。本质上,它使用反射来搜索两种类型之间的隐式转换(搜索“op_Implicit”以获取更多信息)。如果没有,它会为目标类型搜索以源类型作为参数的构造函数,并调用它。如果失败,它会搜索可以将一种类型解析为另一种类型的Parse方法。这将找到Int32.Parse之类的东西,它从String转换为Int,或IPAddress.Parse,它从String转换为IPAddress。作为性能优化,一旦找到转换,它会将其保存在[type,type][conversionMethodInfo]的字典中,以便后续调用不必经过广泛的反射搜索。这可以很好地处理几乎所有类型的转换。我多次遇到你的问题。我一直发现构建和使用转换函数所花费的时间抵消了它节省的时间。最终会出现精度和舍入等问题,你仍然需要处理特殊情况。检查dbnull...我使用typeof(object)isDbNull...一个有趣的小练习!我就是这么写的,不行就挂我吧,不过这里我尝试转换一下我现在能想到的不同方式。publicstaticclassConverter{publicstaticboolTryConvert(objecto,outTresult){if(o==null&&typeof(T).IsClass){result=default(T);}返回真;}varconvertible=oasIConvertible;if(convertible!=null&&ConvertibleHandlesDestinationType()){result=(T)Convert.ChangeType(convertible,typeof(T));返回真;}if(o!=null){if(typeof(T).IsAssignableFrom(o.GetType())){结果=(T)o;返回真;}varconverter=TypeDescriptor.GetConverter(o);如果(converter.CanConvertTo(typeof(T))){结果=(T)converter.ConvertTo(o,typeof(T));返回真;}}结果=默认值(T);返回假;}privatestaticboolConvertibleHandlesDestinationType(){returntypeof(T).Equals(typeof(Boolean))||typeof(T).Equals(typeof(Byte))||typeof(T).Equals(typeof(char))||typeof(T).Equals(typeof(DateTime))||typeof(T).Equals(typeof(小数))||typeof(T).Equals(typeof(Double))||typeof(T).Equals(typeof(Int16))||typeof(T).Equals(类型(Int32))||typeof(T).Equals(typeof(Int64))||typeof(T).Equals(typeof(SByte))||typeof(T).Equals(typeof(Single))||typeof(T).Equals(typeof(string))||typeof(T).Equals(typeof(UInt16))||typeof(T).Equals(typeof(UInt32))||typeof(T).Equals(typeof(UInt64));由于输出参数是T类型,我们可以使用类型推断,这样调用看起来像:intnumber;如果(Converter.TryConvert("123",outnumber)){Debug.WriteLine(number);尝试使用泛型,这样您就不必执行必须执行的所有运行时类型检查(在编译时完成)。即使使用Convert.IsDBNull,也有更好的检查方法:if(!databaseFieldisDBNull)另请注意,您可以在Type上使用==,因为特定类型只有一个Type实例。你见过这个功能吗?:Microsoft.VisualBasic.CType()我在我的博客usingDataTables/Datarows上写了一篇关于如何使用DataTow来管理类型转换的博文以上就是C#学习教程的全部内容:Howtomakeageneraltypeconversionmethod,如果对大家有用,需要详细了解C#学习教程,希望大家多多关注—//////操作DataRows的扩展方法///publicstaticclassDataRowUserExtensions{//////判断是否为[为null或空字符串][指定的数据行]。//////数据行。///钥匙。//////trueif[isnulloremptystring][指定的数据行];否则,错误。///publicstaticboolIsNullOrEmptyString(thisDataRowdataRow,stringkey){if(dataRow.Table.Columns.Contains(key))returndataRow[key]==null||复制代码数据行[键]==DBNull。价值||dataRow[key].ToString()==string.Empty;thrownewArgumentOutOfRangeException(key,dataRow,"不包含列");}//////获取指定的数据行。/////////数据行。///钥匙。///publicstaticTGet(thisDataRowdataRow,stringkey){if(dataRow.Table.Columns.Contains(key))返回dataRow.IsNullOrEmptyString(key)?默认(T):(T)ChangeTypeTo(数据行[键]);thrownewArgumentOutOfRangeException(key,dataRow,"不包含列");}//////将类型更改为。/////////价值。///privatestaticobjectChangeTypeTo(thisobjectvalue){if(value==null)returnnull;TypeunderlyingType=typeof(T);if(underlyingType==null)thrownewArgumentNullException("value");if(underlyingType.IsGenericType&&underlyingType.GetGenericTypeDefinition().Equals(typeof(Nullable))){varconverter=newNullableConverter(underlyingType);underlyingType=converter.UnderlyingType;}//Guid转换if(underlyingType==typeof(Guid)){returnnewGuid(value.ToString());}//转换是否返回underlyingType.IsAssignableFrom(value.GetType())?Convert.ChangeType(value,underlyingType):Convert.ChangeType(value.ToString(),underlyingType);}}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如有转载请注明出处: