使用泛型和简单地将字符串值转换为枚举时将字符串值转换为枚举时的混淆

     2023-02-25     278

关键词:

【中文标题】使用泛型和简单地将字符串值转换为枚举时将字符串值转换为枚举时的混淆【英文标题】:Confusion when casting string value to enum using generic and simply casting string value to enum 【发布时间】:2019-07-14 02:13:42 【问题描述】:

我正在尝试理解泛型,当我在Generics 上观看 SCOTT ALLEN 的 1 个复数视频时,他展示了丑陋代码与好代码的示例 代码,但我不明白我想在下面提到的东西:

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 是相同的,或者我可能没有正确理解为什么第二个代码更好,因为它正在执行相同类型的强制转换。

有人可以解释一下第二个代码是如何强类型的,并且按照作者的说法更好,尽管它与第一个代码 sn-p 进行相同的转换吗?

【问题讨论】:

对我来说,扩展似​​乎更丑陋,因为它意味着你可以将 every 字符串解析为一个你当然不能的枚举。话虽如此,您的问题完全是基于意见的。你应该问作者他有什么更好的代码。 扩展的另一个问题是您可以将任何类型作为泛型类型传递,并且代码将编译,但会在运行时抛出。 (例如input.ParseEnum&lt;SomeClass&gt;() 会抛出) 【参考方案1】:

我认为这是一个不好的例子。我认为第二个代码 sn-p 是“好代码”的唯一原因是它符合 DRY 原则(不要重复自己)。这是通用代码,代码被编写了 100 次,但现在只完成了一次,并且做得很好。

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

【讨论】:

我们真的应该回答这个假设某事是好还是坏的问题吗?这不是基于意见的问题吗? 我怀疑这个问题是否可以利用客观答案。我认为是的。 @HimBromBeere 我对此并不完全确定。 OP 说它不是“强类型”,它与第一个版本完全相同。可以客观回答。帕特里克,顺便说一句,答案很好 @CamiloTerevinto 我同意“强类型”部分的回答很简单,因为它完全是错误的。然而,这不是真正的问题,即“为什么它更好”,这意味着它更好,这不能客观地声称。 @HimBromBeere 我只是想从泛型的角度理解第二个代码 sn-p 与第一个代码 sn-p 相比如何强类型和更好【参考方案2】:

良好的代码和强类型

这不是好的代码,没有什么比第一个示例中的强类型了。更重要的是,IntelliSense 会建议我这样做

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

是有效的,但显然不是。事实上,对于这样的场景,该代码甚至没有 try-catch。

总的来说,第二个 sn-p 只是为了符合 DRY 更好一些,但我不会将其作为扩展方法,也不会将其称为强类型。

【讨论】:

为什么它不是强类型是我想要理解的 @ILove*** 因为 Parse 永远不能被强类型化。强类型意味着您正在使用一个类,因此重命名该类可以修复对它的引用 所以假设问题中提到的代码需要强类型,那么需要做什么?只是为了我对泛型的了解 代码示例没有帮助。比较ArrayList and List&lt;T&gt;。这是一个很好的例子。 @ILove*** 泛型对这个例子没有帮助,这就是问题所在。正如 Patrick 提到的,泛型有助于避免使用 object 而不是类,例如【参考方案3】:

我会说扩展方法在使用时提供了更好的可读性,我猜这就是 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;

...但这不是重点。

【讨论】:

感谢您为帮助我所做的努力以及您宝贵的时间。感谢:)

swift中泛型和any类型

...而Any类型则可以避开Swift的类型系统(所以应该尽可能避免使用)。让我们考虑一个最简单的例子,构想一个函数,除了返回它的参数,其它什么也不做。如果使用泛型,我们可能写为下面这样:而使用Any类型,则可能写为这样:... 查看详情

在 Swift 中使用 JSONDecoder 在解析 JSON 时将空值转换为默认字符串

】在Swift中使用JSONDecoder在解析JSON时将空值转换为默认字符串【英文标题】:ConvertnullvaluestodefaultstringsinparsingJSONusingJSONDecoderinSwift【发布时间】:2020-06-1020:35:06【问题描述】:我正在尝试使用JSONDecoder在Swift中解析一些JSON,其中JS... 查看详情

如何使用 LinqToSql 将字符串值隐式转换为枚举?

】如何使用LinqToSql将字符串值隐式转换为枚举?【英文标题】:HowdoyouimplicitlyconvertastringvaluetoanenumerationusingLinqToSql?【发布时间】:2009-06-2315:56:26【问题描述】:我向previousquestion询问了有关使用LinqToSql在表上映射枚举值的问题,... 查看详情

泛型和枚举

...合框架里面很常见,只要有<>就定义泛型。什么时候使用泛型类?      当类中要操作的引用数据类型不确定的时候,早期定义Object来完成扩展,现在定义泛 查看详情

为字符串对象属性定义类型。泛型和显式类型之间的区别

】为字符串对象属性定义类型。泛型和显式类型之间的区别【英文标题】:Definingatypeforobjectpropertiesthatarestrings.Differencesbetweengenericandexplicittypes【发布时间】:2020-08-1706:02:49【问题描述】:Playgroundlinkhere我想定义一个函数searchText... 查看详情

从字符串转换为具有大量值的 Java 枚举 [重复]

】从字符串转换为具有大量值的Java枚举[重复]【英文标题】:ConvertfromStringtoaJavaenumwithlargeamountofvalues[duplicate]【发布时间】:2015-02-2611:31:55【问题描述】:假设我有一个包含100个值的枚举。为简单起见,举个例子:publicenumcodeCODE_... 查看详情

泛型和枚举

...全机制.泛型格式;通过<>定义操作的引用数据类型。使用:当类中要操作的引用数据类型不确定的时候,早起定义Object来完成扩展,现在定义泛型类来扩展。泛型类定义的泛型,在整个类中有效,如果被方法是用,那么泛型... 查看详情

枚举使用编译时常量转换为字符串

】枚举使用编译时常量转换为字符串【英文标题】:Enumconverttostringusingcompiletimeconstants【发布时间】:2019-04-0105:11:27【问题描述】:我正在尝试将编译时间字符串与枚举值相关联。这是我第一次尝试解决这个问题:EnumValue将在字... 查看详情

如何在读取 CSV 文件时将字符串值转换为整数值?

】如何在读取CSV文件时将字符串值转换为整数值?【英文标题】:HowtoconvertstringvaluestointegervalueswhilereadingaCSVfile?【发布时间】:2016-02-0611:28:57【问题描述】:打开CSV文件时,整数列被转换为字符串值(“1”、“23”等)。循环将... 查看详情

在处理 csv 文件时将字符串转换为浮点值

】在处理csv文件时将字符串转换为浮点值【英文标题】:Convertstringsintofloatvaluewhileworkingoncsvfile【发布时间】:2020-12-1706:48:45【问题描述】:我有CSV文件要训练,但训练时出现错误。ValueError:无法将字符串转换为浮点数:\'CBH\'【... 查看详情

使用类型泛型时如何正确地将类转换为抽象类?

】使用类型泛型时如何正确地将类转换为抽象类?【英文标题】:Howtocorrectlycastaclasstoanabstractclasswhenusingtypegenerics?【发布时间】:2014-11-0516:54:39【问题描述】:我有以下课程publicabstractclassBaseViewPresenterpublicabstractclassBaseView<T>... 查看详情

如何最好地将字符串表示形式转换为 DbType?

】如何最好地将字符串表示形式转换为DbType?【英文标题】:HowdoIbestconvertastringrepresentationintoaDbType?【发布时间】:2010-09-1014:32:20【问题描述】:假设我有一个字符串“nvarchar(50)”,例如用于创建该类型表的T-SQL字符串段。如何... 查看详情

如何按类将字符串值转换为枚举值? [复制]

】如何按类将字符串值转换为枚举值?[复制]【英文标题】:HowtocastaStringvaluetoanEnumvaluebyClass?[duplicate]【发布时间】:2015-06-2918:24:32【问题描述】:我有以下课程:publicclassEnumContainerprivateClass<?>enumClass;//GET,SETpublicEnumContainer(Cl... 查看详情

如何将字符串转换为枚举值到整数? [复制]

】如何将字符串转换为枚举值到整数?[复制]【英文标题】:HowdoIconvertastringtoanenumvaluetoaninteger?[duplicate]【发布时间】:2012-04-3003:38:08【问题描述】:可能重复:HowdoIConvertastringtoanenuminC#?Enumsreturningintvalue我已经声明了一个枚举:-... 查看详情

Jackson 无法将空字符串值转换为枚举

...布时间】:2018-12-2615:46:09【问题描述】:我正在寻找一个使用Jackson(2.8)的便捷解决方案,以在反序列化之前/期间过滤掉指向空字符串值的字段:@JsonInclude(JsonInclude.Include.NON_EMPTY)publicclassGuispublic 查看详情

可靠地将任何对象转换为字符串,然后再返回

】可靠地将任何对象转换为字符串,然后再返回【英文标题】:ReliablyconvertanyobjecttoStringandthenbackagain【发布时间】:2012-02-1119:38:33【问题描述】:是否有可靠的方法将任何对象转换为字符串,然后再转换回同一个对象?我见过一... 查看详情

将字符串转换为角度 8 中的枚举值

】将字符串转换为角度8中的枚举值【英文标题】:convertstringtoenumValueinangular8【发布时间】:2020-03-2009:59:45【问题描述】:我需要将enumtype传递给服务器。但是当我将表单发送到服务器时,它会通过类型string发送enumfild。这是我的... 查看详情

当 String 是有效的 char 时将 String 转换为 char

...正在使用蓝牙进行套接字通信,其中我将十六进制值作为字符串格式的变量。我会写-charchar1=0x7D;但不知何故,如果值0x7D是字符串,那么如何将其转换为字符。例如,我做不到-Stringstring1= 查看详情