Попробуйте
($b/HolidayType/text(),"")[1]
Если в последовательности есть ноль, то ноль просто исчезает.
('A', 'B', 'C', (), 'E')
становится ('A', 'B', 'C', 'E')
в 3.5, выражение - это один из способов указать имена членов в виде кода; вы можете получить:
public void AddMapping<TObj,TValue>(Control myControl, TObj myObject,
Expression<Func<TObj, TValue>> mapping) {...}
и затем проанализировать дерево выражений, чтобы получить значение. Немного неэффективно, но не так уж плохо.
Вот пример кода:
public void AddMapping<TSource, TValue>(
Control control,
TSource source,
Expression<Func<TSource, TValue>> mapping)
{
if (mapping.Body.NodeType != ExpressionType.MemberAccess)
{
throw new InvalidOperationException();
}
MemberExpression me = (MemberExpression)mapping.Body;
if (me.Expression != mapping.Parameters[0])
{
throw new InvalidOperationException();
}
string name = me.Member.Name;
// TODO: do something with "control", "source" and "name",
// maybe also using "me.Member"
}
вызывается с:
AddMapping(myControl, foo, f => f.Bar);
Подумайте об использовании лямбды или даже System.Linq.Expressions
для этого с одним из:
extern void AddMapping<T,U>(Control control, T target, Func<T,U> mapping);
extern void AddMapping<T,U>(Control control, T target, Expression<Func<T,U>> mapping);
Затем вызовите его с
this.AddMapping(this.myControl, myObject, (x => x.PropertyName));
Используйте аргумент Expression, если вам нужно разбирать абстрактное синтаксическое дерево во время выполнения, выполнять рефлексивные вещи, такие как получение имени свойства в виде строки; в качестве альтернативы, пусть делегат выполнит работу по отбору необходимых вам данных.
Вы действительно не должны передавать строковые литералы в качестве имен свойств. Вместо этого вы должны использовать YourClass.PROPERTY_NAME_FOO
.
Вы должны объявить эти строки как константы в вашем классе.
public const String PROPERTY_NAME_FOO = "any string, it really doesn't matter";
public const String PROPERTY_NAME_BAR = "some other name, it really doesn't matter";
Или вам вообще не нужно беспокоиться о строках, просто имена свойств:
public const int PROPERTY_NAME_FOO = 0;
public const int PROPERTY_NAME_BAR = 1; //values don't matter, as long as they are unique
Это предотвратит попадание строк, которые не ссылаются на допустимое свойство, в вызовы функций.
Intelisense сможет показывать вам имена свойств из вашего класса в качестве подсказок для автозаполнения.
What are you looking for is called Static Reflection. Shameless plug => http://emiajnet.blogspot.com/2009/05/getting-fun-with-net-static-reflection.html And a much better article here: http://www.lostechies.com/blogs/gabrielschenker/archive/2009/02/03/dynamic-reflection-versus-static-reflection.aspx