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

时间:2017-09-15 15:52:54

标签: c# implicit-conversion

我有一个这样的课。

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 个答案:

答案 0 :(得分:3)

您可以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);

答案 1 :(得分:2)

这是无法做到的,因为成员查询运算符.不会考虑除ForeignKey之外的其他类型的成员。

第7.4节解释了这个过程。

  

在类型T中使用K类型参数的名称N的成员查找按如下方式处理:

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

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