使用隐式类型转换调用函数

问题描述 投票:0回答:2

我有一堂这样的课。

public class ForeignKey {
    public string Id {get;}
    public TableA TableA {get;}
    public TableB TableB {get;}
    public static implicit operator string(ForeignKey obj){ return obj.Id; }
    public override string ToString() { return Id; }
    /* various operator overloads */
}

我希望对其进行自动类型转换,这样我就可以像字符串一样使用它。到目前为止我所做的让我可以在很多地方使用它而无需显式转换。但是,我无法找到一种在不进行显式转换的情况下调用字符串函数的方法。

例如,我想让它发挥作用。

if (Key.EndsWith(someValue))

目前我必须这样做

if (((string)Key).EndsWith(someValue))
// or
if (Key.Id.EndsWith(someValue))

有没有办法让它按照我想要的方式工作?

谢谢

c# implicit-conversion
2个回答
3
投票

这是无法完成的,因为成员查找运算符

.
不考虑
ForeignKey
以外类型的成员。

第 7.4 节解释了该过程。

类型 T 中具有 K 类型参数的名称 N 的成员查找处理如下:

  • 首先确定一组名为N的可访问成员
  • 接下来,如果 K 为零,则删除声明中包含类型参数的所有嵌套类型。如果 K 不为零,则删除具有不同数量类型参数的所有成员。
  • 接下来,如果调用该成员,则将从集合中删除所有不可调用的成员。
  • 接下来,被其他成员隐藏的成员将从集合中删除。
  • 接下来,被类成员隐藏的接口成员将从集合中删除。仅当 T 是类型参数并且 T 具有除 object 之外的有效基类和非空有效接口集时,此步骤才有效。
  • 最后,删除隐藏成员后,查找结果就确定了:
    • 如果集合由一个不是方法的成员组成,则该成员是查找的结果。
    • 否则,如果集合只包含方法,则这组方法就是查找的结果。
    • 否则,查找不明确,并且会发生绑定时错误。

由于 C# 在成员解析过程中不考虑转换运算符,因此您唯一的选择就是直接或通过扩展将方法添加到您的类中。


3
投票

您可以创建一个扩展方法将此Key作为参数。

namespace ExtensionMethods
{
  public static class Utilities
  {
    public static bool ValueEndsWith(this Key key, ref string valueToCheck)
    {
      return key.Id.EndsWith(valueToCheck);
    } 
  }
}

您可以将其称为

Key.ValueEndsWith(ref valueString)
;

© www.soinside.com 2019 - 2024. All rights reserved.