UnabletocreateTypeConverterforgenerictypesValue{//get&set}//其他方法}publicclassWrapperConverter:TypeConverter{//仅支持To和From字符串publicoverrideboolCanConvertFrom(ITypeDescriptorContextcontext,TypesourceType){if(sourceType==typeof(string)){返回真;}returnbase.CanConvertFrom(context,sourceType);}publicoverrideboolCanConvertTo(ITypeDescriptorContextcontext,TypedestinationType){if(destinationType==typeof(string)){返回真;}returnbase.CanConvertTo(context,destinationType);}publicoverrideobjectConvertFrom(ITypeDescriptorContextcontext,System.Globalization.CultureInfoculture,objectvalue){if(valueisstring){TypeConverterconverter=TypeDescriptor.GetConverter(typeof(T));Tinner=converter.ConvertTo(value,destination类型);返回新包装器(内部);}returnbase.ConvertFrom(context,culture,value);}publicoverrideobjectConvertTo(ITypeDescriptorContextcontext,System.Globalization.CultureInfoculture,objectvalue,TypedestinationType){if(destinationType==typeof(System.String)){Wrapperwrapper=valueasWrapper();}TypeConverter转换器=TypeDescriptor.GetConverter(typeof(T));返回converter.ConvertTo(w??rapper.Value,destinationType);}returnbase.ConvertTo(context,culture,value,destinationType);问题是你不能在这一行中使用泛型,这是不允许的:[TypeConverter(typeof(WrapperConverter))]publicclassWrapper我的下一个方法是尝试定义一个可以处理反射和混合的类任何Wrapper实例的单个非通用转换器的泛型让我困惑如何实现ConvertTo和ConvertFrom方法。例如,我的ConvertTo看起来像这样:){//1.如何强制该值是一个Wrapper实例?输入innerType=值。获取类型()。GetGenericArguments()[0];TypeConverter转换器=TypeDescriptor。GetConverter(内部类型);//2.如何获取T值属性?引入一个Wrapper实现的接口?对象内部值=???返回converter.ConvertTo(innerValue,destinationType);}returnbase.ConvertTo(context,culture,value,destinationType);我遇到了最大的问题,因为我不知道要将字符串转换为哪个Wrapper类。我已经创建了几个自定义类型和TypeConverter以用于ASP.NET4WebAPI框架,这就是我需要使用它的地方。我尝试的另一件事是在运行时分配我的转换器的通用版本,如此处所示,但WebAPI框架不遵守它(意味着从未创建转换器)。最后一点,我使用的是.NET4.0和VS2010。我通过创建一个转换器来解决这个问题,该转换器可以处理我从泛型类中获得的所有类型。通过在构造函数中捕获信息解决了了解ConvertFrom中的genericsargT的重大问题,如下所示。publicMyGenericConverter(Typetype){if(type.IsGenericType&&type.GetGenericTypeDefinition()==typeof(MyGenericClass)&&type.GetGenericArguments().Length==1){_genericInstanceType=type;_innerType=type.GetGenericArguments()[0];_innerTypeConverter=TypeDescriptor.GetConverter(_innerType);}else{thrownewArgumentException("Incompatibletype","type");我花了很长时间才发现.NET基础结构在定义构造函数重载时会反射性地调用它。它不是记录的TypeConverter类的一部分。希望这一切都能帮助下一个人。以上是C#学习教程:UnabletocreateTypeConverterforgenerictypes。如果对大家有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权请点击右侧联系管理员删除。如需转载请注明出处:
