2010-08-12 4 views
1

Например, предположим, что у меня есть метод, который принимает следующее в качестве параметра:Как узнать тип, указанный выражением?

Expression<Func<T, object>> path 

Как определить тип «объекта», указанного в выражении? В частности, я хотел бы определить, является ли это типом коллекции (например, IEnumerable)

ответ

2

Вы уже используете дженерики, так почему бы не пройти весь путь?

void GetMemberType<TArg, TProperty>(Expression<Func<TArg, TProperty>> path) 
{ 
    // Get the member ... 
    var member = path.Body as MemberExpression; 

    // ... Do whatever you want with the member ... 

    // Now get the type 
    var memberType = typeof(TProperty); 
} 
+0

Вывод типа позволит вам опустить два общих параметра типа при вызове метода, предполагая, что TArg является типичным параметром типа, используемым объявляющим классом - как в 'классе SomeClass {...}'. – Charles

+1

typeof (IEnumerable) .IsAssignableFrom (typeof (TProperty)) получает DanP остальную часть пути. –

+0

Спасибо Carles и Kirk - это именно то, что я * должен был делать :) – DanP

0

Expression.Type ответит на это (выражение «результат» выражения).

Копать глубже и в более общем случае вам нужно будет рассмотреть различные возможности в зависимости от фактического, выполнения, типа Expression — например, какой из многих subtypes of Expression сделать вас на самом деле есть.

+0

Я использую это, чтобы определить выборку стратегий для репозитория, так что " path "будет выглядеть как entity => entity.Property; Мне нужно определить, является ли это «Свойство» типом коллекции. Надеюсь, это поможет прояснить ситуацию. – DanP

+0

@DanP: Свойство 'Type' предоставляет экземпляр' Type', вы можете проверить на реализацию 'IEnumerable' (без которого тип в .NET не является действительно коллекцией) обычным способом. – Richard

+0

это даст мне тип корневого объекта, которому принадлежит свойство; Меня интересовал тип самого объекта. – DanP

1

В качестве альтернативы, вы можете сделать что-то вроде следующего (что более рядный с вами общие аргументы типа):

// Get your expression 
// (probably already provided as an arg to one of your methods, I'm willing to bet) 
Expression<Func<T, object>> path = ... 

var memberExpr = path.Body as MemberExpression; 
var member = memberExpr.Member; 

Type type; 

if (member is FieldInfo) 
{ 
    var field = member as FieldInfo; 
    type = field.FieldType; 
} 

if (member is PropertyInfo) 
{ 
    var property = member as PropertyInfo; 
    type = property.PropertyType; 
} 
+0

спасибо за добавление этого альтернативного метода, хорошо знать, если я почему-то не смог использовать выведенные дженерики. – DanP

Смежные вопросы