gpt4 book ai didi

c# - 动态转换为通用类型

转载 作者:太空狗 更新时间:2023-10-29 22:53:34 25 4
gpt4 key购买 nike

只是在周末到来之前匆匆忙忙......

我有一个具有以下签名的方法,我需要调用它:

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 变量作为参数。我需要做的是将此对象转换为 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); }
}

总而言之,这应该成为一个模糊 OR-Mapping,意在在一两个项目中扩展 NHibernate。

我的意思是如何让它发挥作用?地址是代理的,当使用我的 CustomAttributes 之一调用属性时,我使用 DynamicProxy 的 IInterceptor 接口(interface)来解析关系。主要问题是这种解析必须发生在 IInterceptor.Intercept() 方法中,该方法只有一个参数( see here ),而且我没有可用的通用类型参数。所以,最后这一切再次归结为一个简单的 .Net 问题:我有一个存储在变量中的 Type 和一个必须使用参数调用的 Method上述类型的通用...

很抱歉犯了任何错误(比如将 var 称为 Type - 伙计,这是一个粗略的错误),已经过了相当长的一天 ;-)

最佳答案

你有一些 IObjectProvider<T> .如果T是编译时知道的类型,您可以只使用强制转换。例如,如果 TFoo :

IObjectProvider<Foo> provider = …;
var predicate = (Predicate<Foo>)predicateProperty.GetValue(
invocation.InvocationTarget, null);
Foo item = provider.Get(predicate);

编辑:看来你不知道T在编译时。这意味着您有两个选择:

  1. 使用 dynamic :

    object provider = …
    object predicate = predicateProperty.GetValue(
    invocation.InvocationTarget, null);
    object item = ((dynamic)provider).Get((dynamic)predicate);
  2. 使用反射:

    object provider = …;
    object predicate = predicateProperty.GetValue(
    invocation.InvocationTarget, null);
    var getMethod = provider.GetType().GetMethod("Get");
    object item = getMethod.Invoke(provider, new[] { predicate });

关于c# - 动态转换为通用类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9842222/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com