在您看来,您遇到的最令人惊讶,奇怪,奇怪或真正的"WTF"语言功能是什么?
每个答案只能有一个功能.
我想要做的是这样的:我有枚举标记值的枚举.
public static class EnumExtension
{
public static bool IsSet<T>( this T input, T matchTo )
where T:enum //the constraint I want that doesn't exist in C#3
{
return (input & matchTo) != 0;
}
}
Run Code Online (Sandbox Code Playgroud)
那么我可以这样做:
MyEnum tester = MyEnum.FlagA | MyEnum.FlagB
if( tester.IsSet( MyEnum.FlagA ) )
//act on flag a
Run Code Online (Sandbox Code Playgroud)
不幸的是,C#的通用,其中约束没有枚举限制,只有类和结构.C#不会将枚举视为结构(即使它们是值类型),因此我无法像这样添加扩展类型.
有没有人知道解决方法?
类似于C#中的Cast int to enum,但我的枚举是Generic Type参数.处理这个问题的最佳方法是什么?
例:
private T ConvertEnum<T>(int i) where T : struct, IConvertible
{
return (T)i;
}
Run Code Online (Sandbox Code Playgroud)
生成编译器错误 Cannot convert type 'int' to 'T'
完整代码如下,其中value可以包含int或null.
private int? TryParseInt(string value)
{
var i = 0;
if (!int.TryParse(value, out i))
{
return null;
}
return i;
}
private T? TryParseEnum<T>(string value) where T : struct, IConvertible
{
var i = TryParseInt(value);
if (!i.HasValue)
{
return null;
}
return (T)i.Value;
}
Run Code Online (Sandbox Code Playgroud) 我正在编写一个实用程序函数,它从数据库中获取一个整数,并将一个类型化的枚举返回给应用程序.
这是我试图做的(注意我传入数据读取器和列名而不是int我的真实函数):
public static T GetEnum<T>(int enumAsInt)
{
Type enumType = typeof(T);
Enum value = (Enum)Enum.ToObject(enumType, enumAsInt);
if (Enum.IsDefined(enumType, value) == false)
{
throw new NotSupportedException("Unable to convert value from database to the type: " + enumType.ToString());
}
return (T)value;
}
Run Code Online (Sandbox Code Playgroud)
但它不会让我(T)value说:
无法将类型'System.Enum'转换为'T'.
我也读过很多关于使用的评论Enum.IsDefined.表现明智,听起来很糟糕.我怎样才能保证有效价值?
可能重复:
C#中的枚举类型约束
是否可以enum通过使用其包装类将类型用作通用参数Enum?
我有不同的枚举:
enum errors1 { E1, E3, E8 };
enum errors2 { E0, E2, E9 };
enum errors3 { E7, E4, E5 };
Run Code Online (Sandbox Code Playgroud)
通过以下类声明,我认为我可以实现它:
public class MyErrors<T> where T : Enum
{
T enumeration;
public T getEnumeration()
{
return enumeration;
}
static void Main(string[] args)
{
Program<error1> p = new Program<error1>();
p.getEnumeration().E1 // this call does NOT work
}
Run Code Online (Sandbox Code Playgroud)
但是,由于一般类型是Enum我只能访问类的成员和方法Enum.那么我可以按照我的意图实现它,或者我应该使用其他方法吗?
...与所有那些新的(如果我们计算IEnumerable不是那么新)与monad相关的东西?
interface IMonad<T>
{
SelectMany/Bind();
Return/Unit();
}
Run Code Online (Sandbox Code Playgroud)
这将允许编写以任何monadic类型操作的函数.或者它不是那么重要?
可能重复:
仅对整数的C#泛型约束
映入眼帘!
我正在尝试在C#中设置笛卡尔坐标系,但我不想将自己限制为我的坐标值的任何一种数值类型.有时它们可能是整数,有时它们可能是有理数,取决于上下文.
这对我来说是"通用类",但我对如何将类型限制为积分和浮点感到难过.我似乎无法找到涵盖任何实数概念的课程......
public class Point<T> where T : [SomeClassThatIncludesBothIntsandFloats?] {
T myX, myY;
public Point(T x, T y) {
myX = x;
myY = y;
}
}
Point<int> pInt = new Point<int>(5, -10);
Point<float> pFloat = new Point<float>(3.14159, -0.2357);
Run Code Online (Sandbox Code Playgroud)
如果我想要这种自由度,那么当我在课堂上进行计算,除去bool,字符串,对象等时,我是否选择了"typeof(T)"噩梦?或者更糟糕的是,我是否选择为我想要使用的每种类型的数字创建一个类,每个都有相同的内部数学公式?
任何帮助,将不胜感激.谢谢!
说我有一个类似的枚举:
enum OrderStatus
{
AwaitingAuthorization,
InProduction,
AwaitingDespatch
}
Run Code Online (Sandbox Code Playgroud)
我还在我的枚举上创建了一个扩展方法来整理UI中的显示值,所以我有类似的东西:
public static string ToDisplayString(this OrderStatus status)
{
switch (status)
{
case Status.AwaitingAuthorization:
return "Awaiting Authorization";
case Status.InProduction:
return "Item in Production";
... etc
}
}
Run Code Online (Sandbox Code Playgroud)
灵感来自这里的优秀帖子,我想SelectList用扩展方法将我的枚举绑定到一个:
public static SelectList ToSelectList<TEnum>(this TEnum enumObj)
但是,要在UI下拉列表中使用DisplayString值,我需要添加一个约束
: where TEnum has extension ToDisplayString
显然,除非有一些我不知道的聪明伎俩,否则这一切都不会对当前的方法起作用.
有没有人对我如何能够实现这样的事情有任何想法?
更新:请参阅此问题的底部以获取C#解决方法.
嗨,您好,
请考虑以下扩展方法:
public static bool HasFlags<T>(this T value, T flags)
where T : System.Enum
{
// ...
}
Run Code Online (Sandbox Code Playgroud)
您可能知道,这将在编译时抛出一个错误,因为通常不允许继承类System.Enum.问题是使用enum关键字指定的任何枚举实际上都继承自System.Enum,因此上述代码将是仅将扩展方法限制为枚举的理想方法.
现在显而易见的解决方法是使用Enum而不是T,但是你失去了泛型类型的好处:
MyEnum e;
e.HasFlags(MyOtherEnum.DoFunkyStuff);
Run Code Online (Sandbox Code Playgroud)
上面的代码会使用泛型类型抛出编译时错误,而它只能使用Enum类型抛出运行时错误(如果我实现它的话).
是否有任何编译器选项可用于关闭约束检查,还是有其他一些漂亮的方法来做到这一点?
在建议之前,我想说我不会使用where T : struct或者其他一些,从那以后你就可以做一些奇怪的事情了123.HasFlags(456).
我很难理解为什么会出现这个错误...这是你要使用的同样的问题where T : System.Object,但是你有where T : class...为什么没有where T : enum?
C#解决方法
Jon Skeet已经开始研究一个库,该库将带有约束的类编译为a
IEnumConstraint,然后将其替换为System.Enumpost-build.我相信,这是目前最接近解决这个问题的人.看到:
- 代码项目:http://code.google.com/p/unconstrained-melody/
- 博客条目:http://msmvps.com/blogs/jon_skeet/archive/2009/09/10/generic-constraints-for-enums-and-delegates.aspx
如果此解决方法不可行,则必须将库编写为C++/CLI代码,这不会限制可用于泛型类型约束的内容(请参阅下面的答案中的代码.)
首先,我不知道如何标题这个问题 - 我甚至对如何陈述它感到困惑.
现在提出问题.让我们把System.IO.FileSystemWatcher你设置它的NotifyFilter属性的类:
this.FileSystemWatcher1.NotifyFilter = NotifyFilters.Attributes | NotifyFilters.CreationTime | NotifyFilters.FileName
| NotifyFilters.LastAccess | NotifyFilters.LastWrite | NotifyFilters.Security
| NotifyFilters.Size;
Run Code Online (Sandbox Code Playgroud)
这是设置单个属性的相当多的代码.检查NotifyFilter,这是一个列举.是否有" 懒惰 "或" 快捷 "方式一次性设置所有这些属性?我知道这不一定需要,但我的好奇心被激怒了.
this.FileSystemWatcher1.NotifyFilter = <NotifyFilters.All> ?