gpt4 book ai didi

c# - 静态 IEnumerable?

转载 作者:行者123 更新时间:2023-11-30 17:20:54 27 4
gpt4 key购买 nike

我正在尝试制作一个字符串枚举。这是我到目前为止所得到的,

private class TypedEnum<T> : IEnumerable<T>
{
public IEnumerator<T> GetEnumerator()
{
return GetType().GetFields().Where(f => f.IsLiteral).Select(f => f.GetValue(null)).OfType<T>().GetEnumerator();
}

IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
}

private static class Combinators : TypedEnum<char>
{
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<char> ToEnumerable()
{
return typeof(Combinators).GetFields().Where(f => f.IsLiteral)
.Select(f => f.GetValue(null)).OfType<char>();
}
}

但我希望我可以将 ToEnumerable() 方法放在子类中:(

最佳答案

哈!解决了!

public class TypedEnum<TBase, TValue>
{
public static IEnumerable<TValue> ToEnumerable()
{
return typeof (TBase).GetFields(BindingFlags.Public | BindingFlags.Static)
.Select(f => f.GetValue(null)).OfType<TValue>();
}

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<Combinators, char>
{
public const char DirectChild = '>';
public const char NextAdjacent = '+';
public const char NextSiblings = '~';
public const char Descendant = ' ';
}

只需将类本身作为类型传递给 TypedEnum

关于c# - 静态 IEnumerable?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3898515/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com