2017-09-15 88 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

哦,我不清楚,我想直接調用字符串函數。不創建一組調用各種字符串函數的函數。 –