代码之家  ›  专栏  ›  技术社区  ›  Skye MacMaster

具有隐式类型转换的调用函数

  •  3
  • Skye MacMaster  · 技术社区  · 7 年前

    我有一节这样的课。

    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))
    

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

    谢谢

    2 回复  |  直到 7 年前
        1
  •  3
  •   Sergey Kalinichenko    7 年前

    . 不接受类型以外的成员 ForeignKey 考虑在内。

    第7.4节解释了该过程。

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

    • 首先,确定一组名为N的可访问成员
    • 接下来,如果K为零,则删除其声明包含类型参数的所有嵌套类型。如果K不为零,则删除具有不同类型参数数的所有成员。
    • 接下来,从集合中删除被其他成员隐藏的成员。
    • 最后,删除隐藏成员后,确定查找结果:
      • 如果集合由不是方法的单个成员组成,则该成员是查找的结果。
      • 否则,如果集合仅包含方法,则这组方法是查找的结果。

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

        2
  •  3
  •   Amit Kumar Singh    7 年前

    你可以 create a extension method

    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)