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

3
我有一个类似这样的类。
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))

有没有办法让它按照我的意愿工作?谢谢。

Key.Id已经是字符串类型了,所以你的最后一个选择Key.Id.EndsWith(someValue)应该可以自动运行。 - Amit Kumar Singh
你可以创建一个C#扩展方法,签名为public static KeyValue(this Key key){}。 - Amit Kumar Singh
没错,Key.Id.EndsWith 能够工作,但我想让 Key.EndsWith 也能够工作。 - Skye MacMaster
创建扩展方法...因为最终你只需要检查Id值。在扩展方法内部进行检查。 - Amit Kumar Singh
我认为你无法按预期工作,除非在ForeignKey中添加一个EndsWith方法,可以将其作为实例方法或扩展方法。 - user47589
2个回答

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

哦,我没有表达清楚,我想直接调用字符串函数,而不是创建一个调用各种字符串函数的函数集合。 - Skye MacMaster

3
这是不可能的,因为成员查找运算符“.”只考虑与“ForeignKey”相同类型的成员,不会考虑其他类型的成员。
第7.4节解释了这个过程。
使用以下流程处理名称N和K类型参数的成员查找操作:
1. 首先,确定名为N的可访问成员集。 2. 接下来,如果K为零,则删除包含类型参数声明的所有嵌套类型。如果K不为零,则删除所有具有不同数量类型参数的成员。 3. 然后,如果调用成员,则从集合中删除所有不可调用的成员。 4. 然后,从集合中删除被其他成员隐藏的成员。 5. 接下来,从集合中删除由类成员隐藏的接口成员。仅当T是类型参数并且T具有除object之外的有效基类和非空有效接口集时,此步骤才能生效。 6. 最后,在删除隐藏成员后,确定查找的结果: - 如果该集合仅包含一个不是方法的成员,则该成员是查找的结果。 - 否则,如果该集合仅包含方法,则这组方法是查找的结果。 - 否则,查找是模棱两可的,会出现绑定时错误。
由于C#在成员解析过程中不考虑转换运算符,你唯一的选择是在你的类中添加该方法,直接或通过扩展。

谢谢。看起来我需要添加一堆调用字符串函数的函数。 - Skye MacMaster

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接