2010-04-16 5 views
2

Pouvez-vous utiliser une expression lambda comme argument d'un attribut? La motivation Je pense serait d'éliminer le recours à des chaînes magiqueslambdas et attributs dans C#

Cheers, Berryl

Répondre

1

No. Il y a une spécification d'erreur du compilateur qui gère ce:

un argument d'attribut doit être une expression constante, typeof expression ou une matrice expression création d'un paramètre d'attribut de type

2

Je souhaite, mais il ne semble pas que vous pouvez.

Vous pouvez encapsuler ce que vous voulez dans un type et référencer le type, cependant.

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

Non, vous ne pouvez pas. Les attributs n'acceptent que certaines constantes de compilation.

1

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

paramètres d'attribut sont limitées à des valeurs constantes des types suivants:

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

string

System.Type

enums

object (L'argument à un paramètre d'attribut d'objet de type doit être une valeur constante de l'un des types ci-dessus.)

One-dimensional arrays of any of the above types

+3

Cette référence est pour C# 1.1, btw - pas C# 4 (bien que ce soit encore une information valide, malheureusement) –