Просто быстрый прием до наступления выходных ...
У меня есть метод со следующей подписью, который мне нужно вызвать:
public interface IObjectProvider<T>
{
T Get(Predicate<T> condition);
}
Это даст мнеT
из любого источника, который соответствует критерию предиката.
Теперь это нужно вызывать из контекста, где все, что у меня есть, это:
//the actual predicate that's going to be evaluated
var predicate = predicateProperty.GetValue(invocation.InvocationTarget, null);
//The type that should go into the call as type param
Type relationTargetType = relationDefinition.RelatedType;
Как выМожно предположить, что компилятор не позволит мне использовать переменную predicate
в качестве параметра.Что мне нужно сделать, это преобразовать этот объект в предикат, но параметры общего типа должны быть постоянными во время компиляции, так что это не сработает.
Я начал возиться с этим, но безуспешнодо сих пор:
Type genericPredicateType = typeof(Predicate<>);
Type specificPredicateType= genericPredicateType.MakeGenericType(relationTargetType);
Convert.ChangeType(predicate, specificPredicateType)
Как же я могу сделать это?
РЕДАКТИРОВАТЬ: Я думал, что это был вопрос, не зависящий от варианта использования, но, очевидно,Я был неправ.Итак, поскольку существует такая ажиотаж в отношении того, что я делаю, что у меня есть, почему, и еще чего, вот еще много дополнительной информации.Я пытаюсь разрешить отношения между объектами в прокси (Castle Dynamic Proxy).Следующий фрагмент кода должен объяснить тип отношения, которое я хочу изобразить:
public class Order
{
public virtual int Id { get; set; } // OR-Mapped
public virtual DateTime OrderDate { get; set; } // OR-Mapped
[RelatedObject(typeof(Address), "DeliveryAddressPredicate")]
public virtual Address DeliveryAddress { get; set; }
public Predicate<Address> DeliveryAddressPredicate
{
get { return new Predicate<Address>(a => OrderDate >= a.ValidFrom && OrderDate <= a.ValidTo); }
}
}
public class Address
{
public virtual DateTime ValidFrom { get; set; } // OR-Mapped
public virtual DateTime ValidTo { get; set; } // OR-Mapped
//Not OR-Mapped
[RelatedList(typeof(Order), "OrdersPredicate")]
public virtual IList<Order> Orders { get; set; }
public Predicate<Order> OrdersPredicate
{
get { return new Predicate<Order>(o => o.OrderDate >= ValidFrom && o.OrderDate <= ValidTo); }
}
Подводя итог, предполагается, что он станет Fuzzy OR-Mapping, предназначенным для расширения NHibernate в одном или двух проектах.
Как я хотел заставить это работать?Адрес проксируется, и когда выполняется вызов свойства с одним из моих пользовательских атрибутов, я использую интерфейс IInterceptor DynamicProxy, чтобы разрешить отношение.Основная проблема заключается в том, что это разрешение должно происходить в методе IInterceptor.Intercept (), который имеет только один параметр ( см. Здесь ), и у меня нет доступных параметров универсального типа.Итак, в конце концов все сводится к простому вопросу .Net: у меня Type
хранится в переменной и Method
, который должен вызываться с параметром общего типа вышеупомянутого типа ...
Извините за любые допущенные ошибки (например, вызов var
a Type
- грубый человек), это был целый день; -)