2012-04-25 17 views
5

Próbuję użyć GetCustomAttributes(), aby uzyskać atrybut zdefiniowany w usłudze. Problem polega na tym, że właściwość jest nadrzędna i nie mogę się dowiedzieć, jak wyodrębnić zastąpione z wyrażenia. Mogę tylko ustalić, jak uzyskać klasę podstawową.Uzyskiwanie atrybutu z przesłanianej właściwości za pomocą linq Wyrażenie

Oto niektóre kodu

public class MyAttribute : Attribute 
{ 
    //... 
} 

public abstract class Text 
{ 
    public abstract string Content {get; set;} 
} 

public class Abstract : Text 
{ 
    [MyAttribute("Some Info")] 
    public override string Content {get; set;} 
} 

Teraz próbuję uzyskać MyAttribute z klasy abstrakcyjnej. Ale muszę go pobrać przez Expression. To, co zostało z użyciem:

Expression<Func<Abstract, string>> expression = c => c.Content; 
Expression exp = expression.Body; 
MemberInfo memberType = (exp as MemberExpression).Member; 

var attrs = Attribute.GetCustomAttributes(memberType, true); 

Niestety atts kończy jako pusty. Problem polega na tym, że menberType kończy się na Text.Content zamiast na klasie Abstract.Content. Więc kiedy dostaję atrybuty, to nic nie zwraca.

Odpowiedz

3

Nie działa, ponieważ MemberExpression ignoruje przesłonięcia i zwraca właściwość z typu podstawowego Text, dlatego nie można znaleźć atrybutu.

Możesz przeczytać o tym problemie tutaj: How to get the child declaring type from an expression?

jednak masz wszystkie informacje w ekspresji i można uzyskać atrybut trochę więcej refleksji (szybkie i brudne próbek):

Expression<Func<Abstract, string>> expression = (Abstract c) => c.Content; 
Expression exp = expression.Body; 
MemberInfo memberType = (exp as MemberExpression).Member; 

var attrs = Attribute.GetCustomAttributes(
expression.Parameters[0].Type.GetProperty(memberType.Name)); 
+0

Dziękuję za link do drugiego pytania. Szukałem czegoś podobnego, ale tego nie znalazłem. – Jero

+0

To rozwiązanie, które dałeś, jest pracą, z której korzystałem do tej pory, więc miło uzyskać niezależne wsparcie dla tego :-) Dzięki – Jero