【问题标题】:Where to put conversion functions?在哪里放置转换函数?
【发布时间】:2010-03-04 07:40:28
【问题描述】:

由于 C# 缺乏对独立函数的支持,我发现很难找到放置转换函数的地方。例如,我想将枚举转换为数字。在 C++ 中,我会为此创建以下独立函数:

UINT32 ConvertToUint32(const MyEnum e);

如何在 C# 中优雅地做到这一点?我是否应该创建一个虚拟静态类来保存该函数,如果是,我怎样才能为它找到一个有意义的名称?还是我应该做一个部分类转换?

有什么想法吗?

提前致谢。

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

Person ConvertToPerson(const SpecialPersonsEnum e);

【问题讨论】:

  • MyEnum e = (MyEnum)3;或 MyInt i = (Int)e;都是在 C# 中在 int 和 enum 之间进行转换的可接受方式。话虽如此,我总是将转换函数放在实用程序类中。
  • +1 partial class Convert 是个好主意。
  • 如果您想从枚举转换为 Person 类,请编写转换运算符。当你可以写一个你想要的操作符时,为什么还要乱用一个方法呢?
  • @Eric:这可以在 Person 类和 SpecialPersonsEnum 在第三方库中的一般情况下完成吗?
  • 不幸的是,没有。转换运算符的代码必须放在被转换事物之一的声明中;在这种情况下,它必须是 Person 声明,因为您不能将代码放入枚举中。我们正在考虑一个功能“扩展转换”,它可以让你做你描述的事情;如果你有一个非常棒的场景,我很想听听。

标签: c# coding-style


【解决方案1】:

上面的示例看起来像是扩展方法的候选者。
如果这不可能,我将它们定义为静态类中的静态方法;我通常会将它们放在一个名为 XXXHelper 的静态类中

【讨论】:

  • 在这种特殊情况下,强制转换就可以了,在一般情况下,我同意 Gishu 并尝试在生成“助手”类之前使用扩展方法。使功能尽可能靠近它所属的位置(当然要保持 SRP)。
  • 你是对的!我没想到扩展方法可以用于枚举,但显然它们可以。
【解决方案2】:

我会选择:

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

            // ... Implementation

            return m;
        }
    }   
}

然后您只需使用MyEnum.ConvertToInt(); 即可对同一类中的多个转换执行相同的操作。简而言之,扩展方法,该死的性感。


另外,Eric's 关于类型转换器的评论让我在谷歌上搜索。非常棒,但是我不确定如何将它们与Enum 一起使用,但是对于其他转换,它们很干净,可以实现。看看这里:

【讨论】:

    【解决方案3】:

    我建议您创建和组装将包含您将在其他项目中使用的所有 辅助方法/常量和枚举

    这将使您可以轻松地将此程序集与其他需要它的程序集包含在内,并避免循环引用。

    【讨论】:

      【解决方案4】:

      你不能为此使用演员表吗? (UInt32)e。或者拨打Convert.ToUInt32(e)

      【讨论】:

      • 是的,但我说的是一般情况。我的例子只是为了说明情况。
      【解决方案5】:

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

      http://msdn.microsoft.com/en-us/library/bb383974.aspx

      我认为在您的特定示例中执行部分类 Convert 最有意义。

      【讨论】:

        【解决方案6】:

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

        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
            }
        }
        

        【讨论】:

        • 为此...为什么要使用 .Net System.Convert 类?