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
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
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
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))]
Non, vous ne pouvez pas. Les attributs n'acceptent que certaines constantes de compilation.
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
Cette référence est pour C# 1.1, btw - pas C# 4 (bien que ce soit encore une information valide, malheureusement) –