Как создать индексированное свойство acess выражение в .net 3.5? - PullRequest
2 голосов
/ 15 ноября 2011

В .NET 4.0 можно написать что-то вроде этого:

ParameterExpression objExpr = Expression.Parameter(typeof(SomeIndexedType), "Obj");
ParameterExpression indexExpr = Expression.Parameter(typeof(int), "Index");
Expression indexAccessExpr = Expression.ArrayAccess(objExpr, indexExpr);

Есть ли способ создать выражение индексированного свойства в .NET 3.5?

Ответы [ 2 ]

1 голос
/ 28 июня 2012

Использовать метод get_Item:

var methodInfo = typeof(SomeIndexedType).GetMethod("get_Item");
Expression.Call(objExpr, methodInfo, ...
1 голос
/ 15 ноября 2011

Свойство index для типа помечено атрибутом DefaultMemberAttribute.Это свойство устанавливается для класса / структуры / интерфейса.В C # при определении индексированного свойства (например, public char this[int index]) ему будет присвоено имя Item, хотя я не думаю, что это жесткое правило.

Теперь интересные вещи со свойствамив том, что вы можете вызывать их с параметрами (даже с геттерами), поэтому, получив имя свойства index, вы просто делаете Expression.Property.Например:

string defaultMember=GetDefaultPropertyName(typeof(SomeIndexType));
ParameterExpression indexExpr = Expression.Parameter(typeof(int), "Index");
Expression indexAccessExpr = Expression.Property(objExpr, defaultMember, indexExpr);

Очевидно, вам придется реализовать GetDefaultPropertyName, чтобы получить свойство от типа.Как только вы получите атрибут, свойство MemberName сообщит вам, к какому свойству вам нужно получить доступ.

...