Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#-使用附加变量类型在模板化方法中动态设置返回类型_C#_Templates_Types_Typeconverter - Fatal编程技术网

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可能不是个坏主意。修复了。太棒了,谢谢。好的方面,有没有更好的方法来保留方法的泛型属性?我想不出来,因为泛型不适用于此。泛型适用于你想对对象应用相同类型的处理,而不管其类型如何。但是转换将字符串转换为十六进制值需要与
字节[]
完全不同的处理方法,因此最好对它们使用单独的方法。