Просто быстренько перед выходными...
У меня есть метод со следующей сигнатурой, который мне нужно вызвать:
public interface IObjectProvider
{
T Get(Predicate 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). Следующий фрагмент должен пояснить тип отношения, который я хочу изобразить:
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 DeliveryAddressPredicate
{
get { return new Predicate(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 Orders { get; set; }
public Predicate OrdersPredicate
{
get { return new Predicate(o => o.OrderDate >= ValidFrom && o.OrderDate <= ValidTo); }
}
Подводя итог, предполагается, что это должно стать нечетким ИЛИ-отображением, предназначенным для расширения NHibernate в одном или двух проектах.
Как я хотел заставить это работать? Адрес передается через прокси, и когда выполняется вызов свойства с одним из моих CustomAttributes, я использую интерфейс DynamicProxy IInterceptor для разрешения отношения. Основная проблема заключается в том, что это разрешение должно происходить в методе IInterceptor.Intercept(), который имеет только один параметр (см. здесь), и у меня нет доступного параметра универсального типа. Итак, в конце концов, все снова сводится к простому вопросу .Net: у меня есть Type
, хранящийся в переменной, и Method
, который должен вызываться с общим параметром вышеуказанный тип...
Извините за любые допущенные ошибки (например, вызов var
a Type
- чувак, это было грубо), день выдался ;-)