Я перепробовал все варианты, которые могут найти другие, использующие, и, честно говоря, все они, кажется, сводятся к тому, что у меня уже есть.
Я хочу универсальную систему для вызова методов, основанных на общих входных данных.Не уверен, что это действительно захватывает это полностью, но не уверен, как это сформулировать.
Вот так:
Я хочу сделать панировочные сухари из параметров Expression>
здесьSelectedDivisions - ObservableCollection, а ModelId - длинный?Итак, дело в том, что я хочу передать список переменных свойств, чтобы они обрабатывались классом данных таким образом, чтобы каждое из них обрабатывалось соответствующим методом внутри данных
data.MakeBreadCrumbs(() => dc.SelectedDivisions, () => dc.ModelId);
данные содержат следующий код:
public void MakeBreadCrumbs(params Expression<Func<object>>[] propertyExpressions) {
foreach (Expression<Func<object>> propertyExpression in propertyExpressions) {
MemberExpression member = propertyExpression.Body as MemberExpression;
if (member == null) {
UnaryExpression uExp = propertyExpression.Body as UnaryExpression;
member = uExp.Operand as MemberExpression;
}
PropertyInfo propInfo = member.Member as PropertyInfo;
Type[] propTypes = propInfo.PropertyType.GetGenericArguments();/
MethodInfo methodInfo = typeof(BreadcrumbData).GetGenericMethod("MakeBreadCrumb", new Type[] { propInfo.PropertyType, typeof(string) }); //
if (methodInfo.IsGenericMethod) {
methodInfo.MakeGenericMethod(propTypes[0]);
}
ConstantExpression ce = Expression.Constant(propertyExpression.Compile().Invoke());
string criterionName = ReadCriterionName(propertyExpression);
methodInfo.Invoke(this, new object[] { ce.Value, criterionName });
}
последняя строка завершается с ошибкой «Операции с поздним связыванием не могут быть выполнены для типов или методов, для которых ContainsGenericParameters имеет значение true».когда я обрабатываю выражение свойства для элемента ObservableCollection.
Вот методы, определенные в классе данных, которые доступны и которые правильно выбраны, но один из методов для ObservableCollection не срабатывает при вызове
(LookupTypeBase - это класс, характерный для моего решения, но вставьте сюда любой тип, который работает с типом поддельного свойства ObservableCollection)
public void MakeBreadCrumb<T>(ObservableCollection<T> selections, string criterionName) where T : LookupTypeBase {...}
public void MakeBreadCrumb(long? value, string criterionName) {...}
public static class xxx {
public static MethodInfo GetGenericMethod(this Type type, string name, Type[] parameterTypes) {
var methods = type.GetMethods();
foreach (var method in methods.Where(m => m.Name == name)) {
var methodParameterTypes = method.GetParameters().Select(p => p.ParameterType).ToArray();
if (methodParameterTypes.SequenceEqual(parameterTypes, new SimpleTypeComparer())) {
return method;
}
}
return null;
}
private class SimpleTypeComparer : IEqualityComparer<Type> {
public bool Equals(Type x, Type y) {
return x.Assembly == y.Assembly && x.Namespace == y.Namespace && x.Name == y.Name;
}
public int GetHashCode(Type obj) {
throw new NotImplementedException();
}
}
}