我有一堂这样的课。
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))
有没有办法让它按照我想要的方式工作?
谢谢
这是无法完成的,因为成员查找运算符
.
不考虑 ForeignKey
以外类型的成员。
第 7.4 节解释了该过程。
类型 T 中具有 K 类型参数的名称 N 的成员查找处理如下:
- 首先确定一组名为N的可访问成员
- 接下来,如果 K 为零,则删除声明中包含类型参数的所有嵌套类型。如果 K 不为零,则删除具有不同数量类型参数的所有成员。
- 接下来,如果调用该成员,则将从集合中删除所有不可调用的成员。
- 接下来,被其他成员隐藏的成员将从集合中删除。
- 接下来,被类成员隐藏的接口成员将从集合中删除。仅当 T 是类型参数并且 T 具有除 object 之外的有效基类和非空有效接口集时,此步骤才有效。
- 最后,删除隐藏成员后,查找结果就确定了:
- 如果集合由一个不是方法的成员组成,则该成员是查找的结果。
- 否则,如果集合只包含方法,则这组方法就是查找的结果。
- 否则,查找不明确,并且会发生绑定时错误。
由于 C# 在成员解析过程中不考虑转换运算符,因此您唯一的选择就是直接或通过扩展将方法添加到您的类中。
您可以创建一个扩展方法将此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)
;