Можете ли вы использовать лямбда-выражения в качестве аргумента для атрибута? Мотивацией я имею в виду было бы устранить зависимость от волшебных струнlambdas и атрибуты в C#
Приветствия, Berryl
Можете ли вы использовать лямбда-выражения в качестве аргумента для атрибута? Мотивацией я имею в виду было бы устранить зависимость от волшебных струнlambdas и атрибуты в C#
Приветствия, Berryl
Нет. Существует спецификация ошибки компилятора, который обрабатывает это:
аргумент атрибут должен быть константным выражением, TypeOf выражения экспрессии или создания массива из параметров типа атрибута
Я хочу, но это не кажется, как будто вы можете.
Вы можете инкапсулировать то, что хотите, в тип и указать тип.
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))]
Нет, вы не можете. Атрибуты принимают только определенные константы времени компиляции.
http://msdn.microsoft.com/en-us/library/aa288454(VS.71).aspx
параметры атрибутов ограничены постоянные значения следующих типов:
Simple types
(BOOL, байты, полукокс, короткая, Int, длинная, с плавающей точкой, и дважды)
string
System.Type
enums
object
(Аргумент к параметру атрибута объекта типа должен быть постоянным значением одного из указанных выше типов.)
One-dimensional arrays of any of the above types
Эта ссылка предназначена для C# 1.1, btw - not C# 4 (хотя, к сожалению, она по-прежнему актуальна) –