相关疑难解决方法(0)

将通用类型的对象传递给约束泛型方法vb.net

我有以下功能(删除了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)

vb.net generics enums

6
推荐指数
1
解决办法
1326
查看次数

为什么代码契约将泛型类型参数的检查标记为未经证实?

我定义了一个具有一个通用方法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不理解语义IsEnumval is Enum(Jon也指出).我感兴趣,如果有任何已知的方法在代码合同中进行这种检查?

c# code-contracts

5
推荐指数
1
解决办法
271
查看次数

如何在(字符串,标志列表,带标志的枚举)之间转换枚举?

如何从枚举转换为字符串,反之亦然?

考虑到枚举可以包含多个标志的情况,如何获得枚举包含的所有标志的列表?

c# enums parsing

5
推荐指数
1
解决办法
2283
查看次数

如何声明一个泛型类型使用的枚举?

我想在父抽象类中声明以下内容:

  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中解决这个问题?

c# generics

4
推荐指数
1
解决办法
8679
查看次数

通用可为空枚举

我想要一个可以从可为空的数据库列解析枚举的方法。我在下面编写了这个方法(并且必须将 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)

c# generics enums nullable

3
推荐指数
1
解决办法
6785
查看次数

标签 统计

c# ×4

enums ×3

generics ×3

code-contracts ×1

nullable ×1

parsing ×1

vb.net ×1