我正在尝试制作一个字符串枚举。这是我到目前为止所得到的,
private class TypedEnum : IEnumerable
{
public IEnumerator GetEnumerator()
{
return GetType().GetFields().Where(f => f.IsLiteral).Select(f => f.GetValue(null)).OfType().GetEnumerator();
}
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
}
private static class Combinators : TypedEnum
{
public const char DirectChild = '>';
public const char NextAdjacent = '+';
public const char NextSiblings = '~';
public const char Descendant = ' ';
}
但这有两个问题。 (1) 它不会编译,因为 Combinators
是静态的......我可以删除它并隐藏 c'tor。 (2) 除非我实例化它,否则它是不可枚举的,我不需要也不想这样做。我有哪些选择?忘了让它可枚举?
我认为这是我能得到的最接近的
public struct Combinators
{
public const char DirectChild = '>';
public const char NextAdjacent = '+';
public const char NextSiblings = '~';
public const char Descendant = ' ';
public static IEnumerable ToEnumerable()
{
return typeof(Combinators).GetFields().Where(f => f.IsLiteral)
.Select(f => f.GetValue(null)).OfType();
}
}
但我希望我可以将 ToEnumerable()
方法放在子类中:(
哈!解决了!
public class TypedEnum
{
public static IEnumerable ToEnumerable()
{
return typeof (TBase).GetFields(BindingFlags.Public | BindingFlags.Static)
.Select(f => f.GetValue(null)).OfType();
}
public static TValue[] ToArray()
{
return ToEnumerable().ToArray();
}
public static string Pattern
{
get
{
return string.Format("(?:{0})", string.Join("|", ToEnumerable().Select(c => Regex.Escape(c.ToString()))));
}
}
}
public class Combinators : TypedEnum
{
public const char DirectChild = '>';
public const char NextAdjacent = '+';
public const char NextSiblings = '~';
public const char Descendant = ' ';
}
只需将类本身作为类型传递给 TypedEnum
。
Tôi là một lập trình viên xuất sắc, rất giỏi!