2010-04-16 2 views
2

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

Приветствия, Berryl

ответ

1

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

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

2

Я хочу, но это не кажется, как будто вы можете.

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

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))] 
0

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

1

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

+3

Эта ссылка предназначена для C# 1.1, btw - not C# 4 (хотя, к сожалению, она по-прежнему актуальна) –