- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我从数据库中得到了一个 Int16
值,需要将其转换为枚举类型。不幸的是,这是在代码层中完成的,除了可以通过反射收集的内容外,该代码层对对象知之甚少。
因此,它最终调用 Convert.ChangeType
,该调用因无效转换异常而失败。
我发现了我认为有臭味的解决方法,如下所示:
String name = Enum.GetName(destinationType, value);
Object enumValue = Enum.Parse(destinationType, name, false);
有没有更好的方法,让我不必通过这个 String 操作?
这是一个简短但完整的程序,如果有人需要试验,可以使用它:
using System;
public class MyClass
{
public enum DummyEnum
{
Value0,
Value1
}
public static void Main()
{
Int16 value = 1;
Type destinationType = typeof(DummyEnum);
String name = Enum.GetName(destinationType, value);
Object enumValue = Enum.Parse(destinationType, name, false);
Console.WriteLine("" + value + " = " + enumValue);
}
}
最佳答案
Enum.ToObject(....
正是您要找的!
C#
StringComparison enumValue = (StringComparison)Enum.ToObject(typeof(StringComparison), 5);
VB.NET
Dim enumValue As StringComparison = CType([Enum].ToObject(GetType(StringComparison), 5), StringComparison)
如果您进行大量枚举转换,请尝试使用以下类,它将为您节省大量代码。
public class Enum<EnumType> where EnumType : struct, IConvertible
{
/// <summary>
/// Retrieves an array of the values of the constants in a specified enumeration.
/// </summary>
/// <returns></returns>
/// <remarks></remarks>
public static EnumType[] GetValues()
{
return (EnumType[])Enum.GetValues(typeof(EnumType));
}
/// <summary>
/// Converts the string representation of the name or numeric value of one or more enumerated constants to an equivalent enumerated object.
/// </summary>
/// <param name="name"></param>
/// <returns></returns>
/// <remarks></remarks>
public static EnumType Parse(string name)
{
return (EnumType)Enum.Parse(typeof(EnumType), name);
}
/// <summary>
/// Converts the string representation of the name or numeric value of one or more enumerated constants to an equivalent enumerated object.
/// </summary>
/// <param name="name"></param>
/// <param name="ignoreCase"></param>
/// <returns></returns>
/// <remarks></remarks>
public static EnumType Parse(string name, bool ignoreCase)
{
return (EnumType)Enum.Parse(typeof(EnumType), name, ignoreCase);
}
/// <summary>
/// Converts the specified object with an integer value to an enumeration member.
/// </summary>
/// <param name="value"></param>
/// <returns></returns>
/// <remarks></remarks>
public static EnumType ToObject(object value)
{
return (EnumType)Enum.ToObject(typeof(EnumType), value);
}
}
现在不用写 (StringComparison)Enum.ToObject(typeof(StringComparison), 5);
你可以简单地写Enum<StringComparison>.ToObject(5);
.
关于c# - Convert.ChangeType 并转换为枚举?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/507059/
我的数据可能非常大,可能是 xmlstring、数据集、数据表、数据行集合。此数据将与其类型一起传递给泛型方法。 void GenericMethod(object data, Type t) {
我发现这篇文章来自 @hugoware关于解析值:http://hugoware.net/blog/more-control-when-parsing-values .我在一个项目中重新使用了他的代码
我有一个有效的自定义消息协议(protocol)的反序列化类。此类使用反射来检查类的属性和协议(protocol)映射的属性。这工作正常,除非值是无符号整数(32 或 64)并且正在转换为整数(32
我想根据另一个变量的类型转换一个变量。 这样做的原因是我有一个扩展方法,它将对 T 应用计算,前提是 T 是 double 、 float 或小数(我在方法开头测试正确的类型)。 所以无论如何,使用以
我想知道 Object Convert.ChangeType( Object object, Type type) 内部发生了什么当 object 的类型匹配 type .它只是捷径并返回object
在我的应用程序中,我经常调用 Convert.ChangeType 以将值转换为动态加载的类型。 但是,在使用 ANTS 进行分析后,我发现此 Convert.ChangeType 似乎需要花费大量时
public static T Convert(String value) { return (T)Convert.ChangeType(value, typeof(T)); }
我从数据库中得到了一个 Int16 值,需要将其转换为枚举类型。不幸的是,这是在代码层中完成的,除了可以通过反射收集的内容外,该代码层对对象知之甚少。 因此,它最终调用 Convert.ChangeT
我想将字符串转换为对象属性值,我将其名称作为字符串。我正在尝试这样做: string modelProperty = "Some Property Name"; string value = "Som
Convert 自 .NET 1.0 起就存在类。 IConvertible 从那时起,界面也已经存在。 Convert.ChangeType 方法仅适用于实现 IConvertible 的类型的对象
给定类(class): public class Foo { public string Name { get; set; } } 是否可以通过 Convert.ChangeType 从字符串
我是 Flutter/Dart 的新手,我正在尝试构建一个具有占位符加载的可重复使用的无限滚动条。类(class)如下: import 'dart:async'; import 'package:fl
NumberFormatInfo nfi = new NumberFormatInfo(); nfi.CurrencySymbol = "$"; var result1 = decimal.Parse
我想制作一个通用的字符串到数字转换器,并将其作为字符串扩展提供,因此我编写了以下代码: public static bool TryParse( this string text, out T res
我有一个代表通用过滤器表达式的类 public class SimpleFilter : BaseRuleExpression { public string field { get; set
此代码将时区添加到 DateTime,在实际场景中,此代码位于一个通用函数内,用于将字符串转换为各种类型。所以我需要一个适用于所有类型的通用代码: DateTime d = DateTime.MinV
遇到以下问题。我有一个属性定义了数据库表中键的名称。使用反射,我用该属性初始化属性或字段的值。一切都很好,直到我将属性定义为数组: [ConfigurationKey("TestArray")] pu
我正在使用 Convert.ChangeType() 将 Object(我从 DataBase 获取)转换为通用类型 T。代码如下所示: T element = (T)Convert.ChangeTy
我正在使用 .Net Connector 6.3.6 处理 MySQL,并在 VS 2010 上创建实体模型。我打算编写一个通用方法,将 EntityObject 添加到其对应的表中。这是它的样子:
这是 this question 的后续行动关于用反射转换值。将某种类型的对象转换为另一种类型可以像这样完成: object convertedValue = Convert.ChangeType(v
我是一名优秀的程序员,十分优秀!