Динамическое приведение к общему типу

Просто быстренько перед выходными...

У меня есть метод со следующей сигнатурой, который мне нужно вызвать:

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, который должен вызываться с общим параметром вышеуказанный тип...

Извините за любые допущенные ошибки (например, вызов vara Type- чувак, это было грубо), день выдался ;-)

5
задан Sebastian Edelmeier 24 March 2012 в 02:19
поделиться