相关疑难解决方法(0)

创建将T限制为枚举的通用方法

我正在构建一个扩展Enum.Parse概念的函数

  • 允许在未找到枚举值的情况下解析默认值
  • 不区分大小写

所以我写了以下内容:

public static T GetEnumFromString<T>(string value, T defaultValue) where T : Enum
{
    if (string.IsNullOrEmpty(value)) return defaultValue;
    foreach (T item in Enum.GetValues(typeof(T)))
    {
        if (item.ToString().ToLower().Equals(value.Trim().ToLower())) return item;
    }
    return defaultValue;
}
Run Code Online (Sandbox Code Playgroud)

我得到一个Error Constraint不能是特殊类System.Enum.

很公平,但是有一个解决方法允许Generic Enum,或者我将不得不模仿该Parse函数并将类型作为属性传递,这会迫使您的代码出现丑陋的拳击要求.

编辑以下所有建议都非常感谢,谢谢.

已经解决了(我已离开循环以保持不区分大小写 - 我在解析XML时使用它)

public static class EnumUtils
{
    public static T ParseEnum<T>(string value, T defaultValue) where T : struct, IConvertible
    {
        if (!typeof(T).IsEnum) throw new ArgumentException("T must be an enumerated type");
        if (string.IsNullOrEmpty(value)) return …
Run Code Online (Sandbox Code Playgroud)

c# generics enums generic-constraints

1122
推荐指数
12
解决办法
33万
查看次数

C#中的拳击事件

我正在尝试收集C#中发生装箱的所有情况:

c# boxing value-type

82
推荐指数
2
解决办法
4007
查看次数

是什么让Enum.HasFlag这么慢?

我正在做一些速度测试,我注意到Enum.HasFlag比使用按位操作慢大约16倍.

有谁知道Enum.HasFlag的内部以及为什么它如此之慢?我的意思是两倍慢不会太糟糕但是当它慢了16倍时它会使该功能无法使用.

如果有人想知道,这是我用来测试其速度的代码.

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;

namespace app
{
    public class Program
    {
        [Flags]
        public enum Test
        {
            Flag1 = 1,
            Flag2 = 2,
            Flag3 = 4,
            Flag4 = 8
        }
        static int num = 0;
        static Random rand;
        static void Main(string[] args)
        {
            int seed = (int)DateTime.UtcNow.Ticks;

            var st1 = new SpeedTest(delegate
            {
                Test t = Test.Flag1;
                t |= (Test)rand.Next(1, 9);
                if (t.HasFlag(Test.Flag4))
                    num++;
            });

            var st2 = new SpeedTest(delegate
            {
                Test t = …
Run Code Online (Sandbox Code Playgroud)

.net c#

64
推荐指数
3
解决办法
2万
查看次数

在WPF MouseLeftButtonDown事件处理程序中按Ctrl键按条件

如何为某个键盘键添加附加条件到WPF MouseLeftButtonDown事件处理程序?

例如Ctrl+键

private void Grid_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{         
    ...
}
Run Code Online (Sandbox Code Playgroud)

c# keyboard wpf event-handling

34
推荐指数
3
解决办法
3万
查看次数

调用值类型的方法会导致在.NET中装箱吗?

我只是参与Stack Overflow问题.NET中的所有内容都是对象吗?.

并且一张海报(在接受的答案的评论中)似乎认为对值类型执行方法调用导致拳击.他向我指出了Boxing和Unboxing(C#编程指南),它没有明确指出我们描述的用例.

我不是一个信任单一来源的人,所以我只是希望得到关于这个问题的进一步反馈.我的直觉是没有拳击,但我的直觉确实很糟糕.:d

进一步阐述:

我使用的例子是:

int x = 5;
string s = x.ToString(); // Boxing??
Run Code Online (Sandbox Code Playgroud)

如果有问题的结构覆盖从对象继承的方法,则不会发生拳击,如此处所接受的答案所述.

但是,如果结构不覆盖该方法,则在callvirt之前执行"约束" CIL命令.根据文档,OpCodes.Constrained Field,这导致拳击:

如果thisType是一个值类型而thisType没有实现方法,则ptr被解除引用,装箱,并作为'this'指针传递给callvirt方法指令.

.net boxing value-type

24
推荐指数
3
解决办法
2584
查看次数

HasFlag有一个通用的枚举?

我刚刚开始使用GenericsC#但很早就遇到了问题,我怎样才能调用.HasFlag()泛型Enum呢?

public class Example<TEnum> where TEnum : struct {
}
Run Code Online (Sandbox Code Playgroud)

如何向其添加[Flags]属性?

c# generics enums enum-flags

7
推荐指数
1
解决办法
2744
查看次数

转换为ValueType时的C#boxing

我正在阅读有关ValueType类的内容,我想知道,当某些东西被转换为ValueType时,它是否被盒装了?例:

void DoSomething(ValueType valueType)
{
}

DoSomething(5);
Run Code Online (Sandbox Code Playgroud)

当DoSomething方法收到时,由int文字表示的是否5被包装?

c#

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