【问题标题】:How to implement auto conversion from one type to another?如何实现从一种类型到另一种类型的自动转换?
【发布时间】:2015-01-06 19:02:18
【问题描述】:

在我的课堂上,我实现了隐式运算符和 IConvertible 接口。当使用 NHibernate 类时(这不是问题),我得到“mytype”类型的对象无法转换为“字符串”。当我查看堆栈跟踪时,显示 System.RuntimeType.TryChangeType 方法中发生错误。如果我反编译代码,它会进一步调用 Binder.ChangeType,所以看起来它不使用 IConvertible 接口。 Binder 是存在于 System.Reflection 命名空间中的抽象类。我如何向系统提供知识,以便能够将我的类型自动转换为字符串。我想将一个具有多个 int 属性的值(组件)对象投影到一个字符串中,并且我不想做额外的步骤。

我们有一个组件 PolicyNumber 映射为

 Component(x => x.PolicyNumber, m =>
            {
                m.Map(x => x.Year, "Year");
                m.Map(x => x.ClientNumber, "ClientNumber");
                m.Map(x => x.OptionNumber, "BidOptionNumber");
            }).ReadOnly();

在 QueryOver 中,我想将其投影到格式为 year-clientNumber-bidOptionNumber 的字符串中。这只是一个例子,我们有更多的值对象来代替魔术字符串。

 .Select(Projections.Group<ClientPolicy>(x => clientPolicy.PolicyNumber))
                            .WithAlias(() => dto.ClientPolicyNumber)

如果将 dto 上的 PolicyNumber 定义为字符串类型,那么我希望 ToString() 发生。我通过在对象上提供一个 Value 属性来解决这个问题,但如果发生这种自动转换会很好。根据调用堆栈跟踪,这似乎是不可能的。我也不想为每个值对象创建 IUserType 实现,因为有很多。

【问题讨论】:

  • 你能给出一个代码示例来说明你正在尝试做什么吗?我的第一反应 - 因为这与 NHibernate 相关 - 是查看 IUserType 接口,以便您可以定义列与自定义类型之间的自定义映射并再次返回。
  • @Anthony:添加了关于我想要实现的目标的映射和更多信息。

标签: c# nhibernate


【解决方案1】:

你没有。没有办法在您的类型和任意类型之间创建隐式转换在运行时(这与编译时的隐式转换完全不同)。您需要让您的代码明确地进行转换。

【讨论】:

  • 我认为可以以某种方式为该类型提供自定义活页夹。
  • @epitka 您可以自己构建一个框架来执行此操作,并且可以使用它来转换类型,但是您无法构建到 C# 的隐式转换,这样任何现有的 C# 操作都依赖于隐式转换将起作用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-24
  • 1970-01-01
  • 2012-03-28
相关资源
最近更新 更多