使用泛型将字符串值强制转换为枚举时的混淆,而只是将字符串值强制转换为枚举

时间:2019-02-20 11:39:33

标签: c# generics

我试图理解泛型,并且在Generics上观看了SCOTT ALLEN的1个复视视频时,他展示了丑陋的代码vs好的例子 代码,但我不明白我想在下面提及的内容:

public enum Steps
{
  Step1,
  Step2,
  Step3
}

丑陋代码示例:

Steps value = (Steps)Enum.Parse(typeof(Steps),input);

良好的代码并具有强类型:

public static class StringExtensions
{
   public static TEnum ParseEnum<TEnum>(this string value)
   {
      return (TEnum)Enum.Parse(typeof(TEnum),value);
   }
}

var input = "Step1";
var value = input.ParseEnum<Steps>();
console.writeline(value);

但是在这里,我不理解第二个代码为什么还不错,因为它也在进行转换,似乎代码1和2相同,或者可能我没有正确理解为什么第二个代码在进行相同类型的转换时更好。

有人可以解释第二个代码是如何严格按照作者类型输入的,尽管它与第一个代码片段的转换方式相同,但按作者的要求更好?

3 个答案:

答案 0 :(得分:3)

我认为这是一个不好的例子。我认为第二个代码段是“好代码”的唯一原因是它符合DRY原则(请勿重复自己)。这是通用代码,可被编写100次,但是现在执行一次就可以了。

对于泛型部分,此代码有很多错误。例如,您可以在不是枚举的类型上调用它。它并没有真正显示出泛型的好处。一个简单得多的例子就可以了。

答案 1 :(得分:3)

  

良好的代码和强类型的输入

那不是很好的代码,没有比第一个示例更强的类型了。如此一来,IntelliSense会向我建议

var name = "@CamiloTerevinto@".ParseEnum<Fruit>();

有效,但显然无效。实际上,对于这种情况,该代码甚至没有try-catch。

总的来说,第二个代码片段只比DRY更好,但是我不会将其作为扩展方法,也不会将其称为强类型。

答案 2 :(得分:1)

我会说扩展方法在使用时提供了更好的可读性,我想这就是Scott Allen试图展示的一个例子。他真的说过它是更强类型的吗?

DRY原理是将其放入方法中的另一个好处。

我还可以通过检查有效的字符串值来扩展它,例如:

public static TEnum ParseEnum<TEnum>(this string enumValue, bool ignoreCase = true) where TEnum : struct
{
    if (!Enum.TryParse(enumValue, ignoreCase, out TEnum result))
    {
        throw new ArgumentException(
            $"{enumValue} is not a valid {typeof(TEnum).Name}",
            typeof(TEnum).Name);
    }

    return result;
}

...但这不重要。