C#-使用附加变量类型在模板化方法中动态设置返回类型
我正在尝试编写一个方法,可以接受任何类型的变量,将其转换为显示其十六进制表示形式的字符串,并基于泛型类型进行输出 为了澄清,我想:C#-使用附加变量类型在模板化方法中动态设置返回类型,c#,templates,types,typeconverter,C#,Templates,Types,Typeconverter,我正在尝试编写一个方法,可以接受任何类型的变量,将其转换为显示其十六进制表示形式的字符串,并基于泛型类型进行输出 为了澄清,我想: 接受T变量(int、string、byte[]和double等) 转换为十六进制(字符串“bacon”=“6261636F6E”) 输出为T型。(我的目标是将其用于字节[]和字符串) 目前我只测试传入字符串&让方法返回字节数组或字符串 电话: string sqliteEncKey = "bacon"; string return = ConvertToHex
- 接受T变量(int、string、byte[]和double等)
- 转换为十六进制(字符串“bacon”=“6261636F6E”)
- 输出为T型。(我的目标是将其用于字节[]和字符串)
string sqliteEncKey = "bacon";
string return = ConvertToHexString<string>( sqliteEncKey );
AND/OR
byte[] return = ConvertToHexString<byte[]>( sqliteEncKey ); // type mismatch issue.
字符串sqliteEncKey=“bacon”;
string return=converttohextstring(sqliteEncKey);
和/或
byte[]return=converttohextstring(sqliteEncKey);//类型不匹配问题。
方法是:
public static T ConvertToHexString<T>( this T _input ) {
string hexString = "";
switch ( Type.GetTypeCode( _input.GetType() ) ) {
case TypeCode.String:
foreach( char c in _input.ToString() ) {
int tmp = c;
hexString += String.Format( "{0:x2}", (uint)System.Convert.ToUInt32( c.ToString() ) );
}
break;
default:
hexString = null;
break;
}
return (T)Convert.ChangeType( hexString, typeof(T) );
}
public static T converttohextString(此T\u输入){
字符串hextstring=“”;
开关(Type.GetTypeCode(\u input.GetType())){
大小写类型代码。字符串:
foreach(在_input.ToString()中的字符c){
int tmp=c;
hexString+=String.Format(“{0:x2}”,(uint)System.Convert.ToUInt32(c.ToString());
}
打破
违约:
hexString=null;
打破
}
return(T)Convert.ChangeType(hexString,typeof(T));
}
我的问题是,在尝试使返回类型动态化时,我似乎也在处理参数。我可以指定要单独传递给返回类型的变量的类型吗
非常感谢 是的,您可以只使用两个通用参数:
public static TRet ConvertToHexString<TVal, TRet>( this TVal _input ) {
public static TRet ConvertToHexString(此TVal\u输入){
但是,如果您像在该case语句中那样检查输入值的类型,那么使用泛型的目的就大打折扣了,使用特定类型可能会更好:
public static TRet ConvertToHexString<TRet>( this string _input ) {
public static TRet ConvertToHexString<TRet>( this byte[] _input ) {
etc.
public static TRet converttohextString(此字符串\u输入){
公共静态TRet ConvertToHexString(此字节[]\u输入){
等
+1-另外,将返回类型指定为最后一个指定的返回类型是否更好(因为它如何与表达式一起工作)?@DavidHoerster可能不是个坏主意。修复了。太棒了,谢谢。好的方面,有没有更好的方法来保留方法的泛型属性?我想不出来,因为泛型不适用于此。泛型适用于你想对对象应用相同类型的处理,而不管其类型如何。但是转换将字符串转换为十六进制值需要与字节[]
完全不同的处理方法,因此最好对它们使用单独的方法。