【问题标题】:Passing an unknown type between brackets在括号之间传递未知类型
【发布时间】:2013-06-27 15:11:56
【问题描述】:

如何传递将在另一个类中定义的未知类型作为此类表达式中的参数。 不知道如何调用表达式。不知道为什么它不记得括号之间的类型以及解决方案是什么。

.AddCallHandler<asp.CallHandlerType>

守则:

 foreach (IAspect asp in Policy.Aspects)
 {
  //Type callHandlerType = asp.CallHandlerType;
  policy.AddMatchingRule(ruleLog)
    .AddCallHandler<asp.CallHandlerType>(new 
      ContainerControlledLifetimeManager());
 }

据说“asp”的类型或命名空间不存在。 我也尝试过更早地定义它并将其传递给“callHandlerType”,这又是一个类似的问题。

foreach asp 中的 CallHandler 类型会有所不同,在一个 它可能是 RestaurantCallHandler,另一个可能是 MagicCallHandler。 这些是在方面定义的。

接口的方法定义:

public interface IAspect
{
   Type CallHandlerType { get; set; }
   // e.g it can be "MagicCallHandler : ICallHandler
}

【问题讨论】:

  • 那么你从哪里调用这个方法呢?你能把它变成一个通用方法吗?
  • @Jon Skeet 嗨,乔恩,是的,我可以。这是我为 Unity 编写的 AOP 框架。我正在发布接口方法的定义。对仿制药不专业,但总是使用它们。如果您将其更改为通用形式,请在致电后发布示例行用法。谢谢
  • 啊,又看了一遍问题,我想我明白了。好的...这可以通过反射来完成。
  • 我已经删除了我的答案,就像新接受的答案一样,我认为我的答案实际上并没有帮助......
  • @Jon Skeet 很明显,您的答案适用于这种情况和其他类似情况,我很感激,我想在更改所选答案之前获得您的许可,同时确定您会同意我的观点,Tuzo 的回答正是对这个问题的直接回答,不需要破解,无论如何,这类问题的破解总是有用的,很高兴知道,我很感激,再次感谢。

标签: c# delegates functional-programming unity-container anonymous-types


【解决方案1】:

一般来说,如果您不知道编译时的类型,您可以使用反射在运行时创建泛型类型。

但是,在这种情况下,Unity 提供了非泛型方法重载(对于大多数功能),它们接受 System.Type 类型的参数而不是泛型类型的参数。这允许您在运行时指定类型或使用未绑定的泛型类型。

在您的情况下,您可以使用此代码来注册您的呼叫处理程序,而无需反射:

foreach (IAspect asp in Policy.Aspects)
{
    policy.AddMatchingRule(ruleLog)
      .AddCallHandler(asp.CallHandlerType, 
        new ContainerControlledLifetimeManager());
}

【讨论】:

  • 我在玩重载,似乎我错过了这个或智能感知,因为我记得它没有向我显示任何不同的重载。它似乎应该简单地工作。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-04-17
  • 2019-12-15
  • 2016-11-07
  • 1970-01-01
  • 1970-01-01
  • 2023-02-22
  • 2014-05-05
相关资源
最近更新 更多