Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/272.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#_Coding Style - Fatal编程技术网

C# 转换函数放在哪里?

C# 转换函数放在哪里?,c#,coding-style,C#,Coding Style,由于C#缺乏对独立函数的支持,我发现很难找到放置转换函数的位置。例如,我想将枚举转换为数字。在C++中,我将为以下内容提供以下独立功能: UINT32 ConvertToUint32(const MyEnum e); 我怎样才能在C#中优雅地做到这一点?我是否应该创建一个用于保存函数的虚拟静态类,如果是,如何为它找到一个有意义的名称?或者我应该进行部分类转换 有什么想法吗 提前谢谢 更新:回想起来,我的示例选择得不是很好,因为枚举和int之间存在默认转换。这是一个更好的示例: Person C

由于C#缺乏对独立函数的支持,我发现很难找到放置转换函数的位置。例如,我想将枚举转换为数字。在C++中,我将为以下内容提供以下独立功能:

UINT32 ConvertToUint32(const MyEnum e);
我怎样才能在C#中优雅地做到这一点?我是否应该创建一个用于保存函数的虚拟静态类,如果是,如何为它找到一个有意义的名称?或者我应该进行部分类转换

有什么想法吗

提前谢谢

更新:回想起来,我的示例选择得不是很好,因为枚举和int之间存在默认转换。这是一个更好的示例:

Person ConvertToPerson(const SpecialPersonsEnum e);

我建议您创建一个包含所有助手方法/常量和枚举的程序集,这些方法/常量和枚举将在其他项目中使用


这将允许您轻松地将此程序集与其他需要它的程序集包括在一起,并避免循环引用。

上面的示例看起来像是扩展方法的候选者。

如果不可能,我将它们定义为静态类中的静态方法;我通常会把它们放在一个名为XXXHelper的静态类中,你就不能使用cast吗<代码>(UInt32)e。或者调用
Convert.ToUInt32(e)

创建静态“虚拟类”的想法似乎是微软建议的:


我认为在您的特定示例中,进行部分类转换最有意义。

我曾经遇到过类似的问题,我做到了这一点

class Program
{
    static void Main(string[] args)
    {
        string s = "123";
        int n = Convert.StringToInt(s);
    }
}

class Convert
{

    public static int StringToInt(string s)
    {
        // implementation
    }
    public static string IntToString(int n)
    {
        // implementation
    }
}
我同意:

namespace ExtensionMethods
{
    public static class MyExtensions
    {
        public static int ConvertToInt(this MyEnum e)
        {
            var m;

            // ... Implementation

            return m;
        }
    }   
}
然后您只需使用
MyEnum.ConvertToInt()可以对来自同一类的多个转换执行相同的操作。简单地说,扩展方法非常性感


另外,关于类型转换器的评论让我在谷歌上搜索。非常棒,但是我不知道如何将它们用于
枚举
,但是对于其他转换,它们的实现非常简单。请看这里:


MyEnum e=(MyEnum)3;或MyInt i=(Int)e;都是C#中int和enum之间转换的可接受方法。也就是说,我总是把我的转换函数放在一个实用类中。+1
partial class Convert
是个好主意。如果你想从枚举转换到类Person,那么就写一个转换操作符。当你可以编写一个运算符来完成你想要的任务时,为什么还要乱弄一个方法呢?@Eric:在一般情况下,Person类和SpecialPersonsEnum都在第三方库中,这能做到吗?不幸的是,不能。转换运算符的代码必须在被转换的某个对象的声明中;在这种情况下,它必须是Person声明,因为不能将代码放入枚举中。我们正在考虑一个功能“扩展转换”,这将允许你做你所描述的;如果你有一个非常棒的场景,我很想听听。是的,但我说的是一般情况。我的例子只是为了说明情况。为此…为什么不使用.Net System.Convert类?在这种特定情况下,强制转换是可以的,在一般情况下,我同意Gishu的观点,并在生成“helper”类之前尝试使用扩展方法。让功能尽可能靠近它所属的位置(当然,在维护SRP的同时)。你说得对!我不希望扩展方法在枚举上起作用,但显然它们确实起作用。