Расширение перечисления в C#

Ну, для не ответа на вопрос непосредственно но я видел, что это происходит. Microsoft недавно запустила инструмент, названный PhotoSynth, который делает что-то очень похожее для определения зон перекрытия в большом количестве изображений (который мог иметь отношения другого аспекта).

интересно, есть ли у них какие-либо доступные библиотеки или фрагменты кода на их блоге.

5
задан Joshscorp 30 October 2009 в 02:27
поделиться

4 ответа

Расширения работают с экземплярами, а не для создания статических методов. Вы можете расширить базовое Enum, используя public static void MyExtensions (это значение Enum) . Но это все равно будет создавать методы только для созданных вами экземпляров Enum. Единственный способ добавить статические методы, как вы говорите, извне для класса, - это если класс является частичным.

Изменить: чтобы сделать что-то вроде вашего, я написал следующее предупреждение

public static bool IsFlagSet<T>(this Enum value, Enum flag)
{
    if (!typeof(T).IsEnum) throw new ArgumentException();
    if (value == flag) return true;
    return ((int)Enum.Parse(typeof(T), value.ToString()) &
        (int)Enum.Parse(typeof(T), flag.ToString())) != 0;
}

*, этот метод требует перед использованием, я надеюсь, что есть лучший способ сделать это.

4
ответ дан 14 December 2019 в 08:54
поделиться

Думаю, вы ищете методы расширения для перечислений. Вот начальная ссылка: http://pietschsoft.com/post/2008/07/C-Enhance-Enums-using-Extension-Methods.aspx

2
ответ дан 14 December 2019 в 08:54
поделиться

Вот лучший тест, который я мог придумать. Помните, что перечисления могут быть основаны на 64-битных int:

 public static bool IsFlagSet(this Enum value, Enum flag)
 {
     if (Type.GetTypeHandle(value).Value != Type.GetTypeHandle(flag).Value)
         throw new ArgumentException();
     return (Convert.ToInt64(value) & Convert.ToInt64(flag)) != 0L;
 }
0
ответ дан 14 December 2019 в 08:54
поделиться

И еще один пример.

    public static bool Includes<T>(this T value, T flag) where T : struct, IConvertible
    {
        var val = value.ToUInt32(null);
        var fl = flag.ToUInt32(null);
        return (val & fl) == fl;
    }

И использование.

SomeEnum val = SomeEnum.One;
bool isOne = val.Includes(SomeEnum.One); // == true
bool isTwo = val.Includes(SomeEnum.Two); // == false
1
ответ дан 14 December 2019 в 08:54
поделиться