2017-09-15 99 views
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)) 

有没有办法得到它的工作,我想如何?

感谢

+0

Key.Id已经是字符串。您的最后一个选项Key.Id.EndsWith(someValue)应该会自动工作。 – Amit

+0

您可以使用签名创建一个C#扩展方法public static KeyValue(this Key key){} – Amit

+0

Right,Key.Id.EndsWith可以工作,但我希望获得Key.EndsWith的工作。 –

回答

2

这是不能做到的,因为成员查找运算符.没有考虑除ForeignKey之外的其他类型的成员。

7.4节解释了过程。

  • 首先,名为N组可访问成员被确定
  • 接下来,如果K:

    在类型T的具有K个类型的参数的名称N的成员查找如下处理是零,所有嵌套类型的声明包括类型参数都被删除。如果K不为零,则删除具有不同数量类型参数的所有成员。

  • 接下来,如果调用该成员,则将从该集合中删除所有不可激活的成员。
  • 接下来,从该集合中删除被其他成员隐藏的成员。
  • 接下来,从类中删除被类成员隐藏的接口成员。如果T是类型参数,并且T具有非对象的有效基类和非空有效接口集,则此步骤仅起作用。
  • 最后,具有除去隐藏的成员时,查找的结果确定:
    • 如果该集合由单个构件不是一个方法,则此部件是查找的结果的。
    • 否则,如果该集合仅包含方法,则这组方法是查找的结果。
    • 否则,查找不明确,并发生绑定时错误。

由于C#不考虑会员解决的过程转换操作符,你唯一的选择是将方法添加到类,直接或通过一个扩展。

+0

谢谢。看起来我会加入一些函数来调用字符串函数。 –

3

您可以create a extension method采取这种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);

+0

哦,我不清楚,我想直接调用字符串函数。不创建一组调用各种字符串函数的函数。 –