Добавляя к ответу Дэна, Func<T, TProperty> selector
просто говорит, что selector
является идентификатором метода, который принимает параметр типа T
и имеет тип возврата TProperty
.Таким образом, допустимый метод, который может быть передан в BindElements
в качестве второго параметра, будет, например,
string CreatePersonElement(IPerson person) {
return string.Format("{0} {1}", person.FirstName, person.LastName);
}
. В этом случае TProperty
будет string
, а T
будетIPerson
.Затем вы можете позвонить BindElements
следующим образом:
BindElements(myPersonCollection,CreatePersonElement);
, где myPersonCollection может быть просто тем, на что вы ссылались List<T>
.Затем для перехода к циклу foreach
foreach (T item in dataObjects) {
// Notice: by delegating the only type-specific aspect of this method
// (the property) to (fittingly enough) a delegate, we are able to
// package MOST of the code in a reusable form.
var property = selector(item);
InlineUIContainer uiContainer = this.CreateElementContainer(property)
para.Inlines.Add(uiContainer);
}
property
устанавливается объект типа TProperty
, который в случае CreatePersonElement
является string
.Если string
не работает для вас, просто измените тип возвращаемого значения метода на тот, который CreateElementContainer
принимает в качестве его параметра.
Затем у вас будет один из этих методов для передачи ввторой параметр для BindElements
для каждого типа, который вы хотите поддерживать (например, ICustomer
, IOrder
).