Silverlight 4 Операции с поздней привязкой не могут быть выполнены ... и примеры не помогают? - PullRequest
0 голосов
/ 05 августа 2011

Я перепробовал все варианты, которые могут найти другие, использующие, и, честно говоря, все они, кажется, сводятся к тому, что у меня уже есть.

Я хочу универсальную систему для вызова методов, основанных на общих входных данных.Не уверен, что это действительно захватывает это полностью, но не уверен, как это сформулировать.

Вот так:

Я хочу сделать панировочные сухари из параметров 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();
    }
}

} ​​

1 Ответ

0 голосов
/ 11 августа 2011

Это silverlight 4, поэтому у вас есть поздний вызов метода с динамическим ключевым словом, что должно сделать это легко и быстро:

BreadcrumbData.MakeBreadCrumb((dynamic)ce.Value, (dynamic)criterionName);

Кроме того, я думаю, что ваша проблема в том, что MakeGenericMethod возвращает новый methodinfo, который вы игнорируете вместо того, чтобы хранить его так:

if (methodInfo.IsGenericMethod) {
        methodInfo = methodInfo.MakeGenericMethod(propTypes[0]);
}
...