лямбды и атрибуты в c # - PullRequest
       13

лямбды и атрибуты в c #

2 голосов
/ 16 апреля 2010

Можете ли вы использовать лямбда-выражения в качестве аргумента для атрибута? Мотивация, о которой я думаю, состоит в том, чтобы устранить опору на магические струны

Ура, Berryl

Ответы [ 4 ]

2 голосов
/ 16 апреля 2010

Я бы хотел, но не похоже, что ты можешь.

Вы можете инкапсулировать то, что вы хотите в типе, и ссылаться на тип, хотя.

public interface Accessor
{
  object GetValue(object source);
}

public class ExpressionDrivenAccessor<T, U> : Accessor
{
  private readonly Func<T, U> getIt;

  protected ExpressionDrivenAccessor(Expression<Func<T, U>> expression)
  {
    getIt = expression.Compile();
  }

  public object GetValue(object source)
  {
    return getIt((T)source);
  }
}

public class SomeAccessor : ExpressionDrivenAccessor<X, Y>
{
  public SomeAccessor() : base(t => t.SomeProperty) { }
}

[MyAttribute(typeof(SomeAccessor))]
1 голос
/ 16 апреля 2010

Нет. Существует спецификация ошибки компилятора, которая обрабатывает это:

Аргументом атрибута должно быть константное выражение, выражение typeof или выражение создания массива типа параметра атрибута

1 голос
/ 16 апреля 2010

http://msdn.microsoft.com/en-us/library/aa288454(VS.71).aspx

Параметры атрибутов ограничены постоянными значениями следующих типов:

Simple types (bool, byte, char, short, int, long, float и double)

string

System.Type

enums

object (Аргумент для параметра атрибута объекта типа должен бытьпостоянное значение одного из вышеперечисленных типов.)

One-dimensional arrays of any of the above types

0 голосов
/ 16 апреля 2010

Нет, вы не можете. Атрибуты принимают только определенные константы времени компиляции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...