我有以下功能(删除了try-catch):
Friend Shared Function ConvertOrDefault(Of T As {Structure, IConvertible})(convertFrom As Object, ignoreCase As Boolean) As T
Dim retVal As T
If Not GetType(T).IsEnum Then
Throw New ArgumentException("Type must be enum")
ElseIf convertFrom Is Nothing OrElse Not TypeOf convertFrom Is String Then
Return New T
ElseIf [Enum].TryParse(convertFrom.ToString(), ignoreCase, retVal) Then
Return retVal
Else
Return New T
End If
End Function
Run Code Online (Sandbox Code Playgroud)
将给定类型转换为枚举(因此约束),如果它是1.
那很好,但是我有另一个方法(下面简化),它执行更一般的转换,如果传入的类型是枚举,我希望它使用该方法:
Friend Shared Function Convert(Of T)(value as Object) As T
If GetType(T).IsEnum Then
Return Enums.ConvertOrDefault(Of T)(value, True)
Else : return …Run Code Online (Sandbox Code Playgroud) 我定义了一个具有一个通用方法DoSomething的以下示例类:
public static class MyClass
{
public static void DoSomething<T>(T val)
{
System.Diagnostics.Contracts.Contract.Requires(typeof(T).IsEnum);
}
}
Run Code Online (Sandbox Code Playgroud)
我有以下枚举:
public enum MyEnum { A, B }
Run Code Online (Sandbox Code Playgroud)
现在我使用我的枚举实例调用该方法,如下所示:
class Program
{
static void Main(string[] args)
{
MyClass.DoSomething(MyEnum.A);
}
}
Run Code Online (Sandbox Code Playgroud)
在代码协定中启用静态检查后,在我调用方法的行显示以下警告:
CodeContracts:需要未经证实:typeof(T).IsEnum
如果在编译时知道该值,为什么它未经证实?
编辑
因为这显然不起作用,可能是因为Code Contracts不理解语义IsEnum或val is Enum(Jon也指出).我感兴趣,如果有任何已知的方法在代码合同中进行这种检查?
如何从枚举转换为字符串,反之亦然?
考虑到枚举可以包含多个标志的情况,如何获得枚举包含的所有标志的列表?
我想在父抽象类中声明以下内容:
public abstract void RefreshDisplay<TView>(Enum value);
Run Code Online (Sandbox Code Playgroud)
然后将在子类中实现,如:
public override void RefreshDisplay<RxViewModel>(RxViews view)
Run Code Online (Sandbox Code Playgroud)
其中RxViews是枚举,并从该枚举"查看"特定值.
直到运行时才会知道它来自的实际视图和枚举.
可以这样做吗?我很感激帮助.
编辑:我可能会问这个错误.TView不是枚举,而是从ViewModelBase继承的视图.(我不知道这是一个重复的问题?)谢谢.
编辑:我猜这是在4.5中修复的.任何想法如何在net 4.0中解决这个问题?
我想要一个可以从可为空的数据库列解析枚举的方法。我在下面编写了这个方法(并且必须将 T 限制为结构才能使其编译)。
它确实可以编译,但我相信它是错误的,因为枚举不是结构?如果是这样,我如何限制泛型方法说我期待一个 ValueType 你不必向我抱怨“只有不可为空的值类型可以是 'System.Nullable' 的基础
private static T? ParseEnum<T>(DataRow row, string columnName)
where T : struct
{
T? value = null;
try
{
if (row[columnName] != DBNull.Value)
{
value = (T)Enum.Parse(
typeof(T),
row[columnName].ToString(),
true);
}
}
catch (ArgumentException) { }
return value;
}
Run Code Online (Sandbox Code Playgroud)