2017-09-15 21 views
3

J'ai une classe comme celle-ci. Je voudrais avoir la conversion de type automatique sur elle donc je peux l'utiliser comme une chaîne. Fonction d'appel avec conversion de type implicite

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 */ 
} 
Ce que j'ai fait jusqu'ici me permet de l'utiliser dans un certain nombre d'endroits sans une distribution explicite. Cependant, je n'arrive pas à trouver un moyen d'appeler des fonctions de chaîne sans faire une distribution explicite. Par exemple, j'aimerais que cela fonctionne. Par exemple, j'aimerais que cela fonctionne.

if (Key.EndsWith(someValue)) 

Actuellement je dois faire

if (((string)Key).EndsWith(someValue)) 
// or 
if (Key.Id.EndsWith(someValue)) 

est-il un moyen de faire fonctionner ce que je veux?

Merci

+0

Key.Id est déjà une chaîne. Votre dernière option Key.Id.EndsWith (someValue) devrait fonctionner automatiquement. – Amit

+0

Vous pouvez créer une méthode d'extension C# pour cela avec la signature en tant que KeyValue statique publique (cette touche Key) {} – Amit

+0

À droite, Key.Id.EndsWith fonctionne mais j'aimerais que Key.EndsWith fonctionne. –

Répondre

2

Cela n'est pas possible car l'opérateur de recherche de membre . ne prend pas en compte les membres de types autres que ForeignKey.

La section 7.4 explique le processus.

Une recherche de membre d'un N nom avec des paramètres de type K dans un type T est traitée comme suit:

  • d'abord, un ensemble d'éléments accessibles nommé N est déterminée
  • Ensuite, si K est nul, tous les types imbriqués dont les déclarations incluent des paramètres de type sont supprimés. Si K n'est pas nul, tous les membres ayant un nombre différent de paramètres de type sont supprimés.
  • Ensuite, si le membre est appelé, tous les membres non invocables sont supprimés de l'ensemble.
  • Ensuite, les membres masqués par les autres membres sont supprimés de l'ensemble.
  • Ensuite, les membres de l'interface qui sont masqués par les membres de la classe sont supprimés de l'ensemble. Cette étape n'a d'effet que si T est un paramètre de type et T a à la fois une classe de base efficace autre que l'objet et un ensemble d'interface effectif non vide.
  • Enfin, ayant enlevé les membres cachés, le résultat de la recherche est déterminée:
    • Si l'ensemble est constitué d'un seul membre qui n'est pas une méthode, alors ce membre est le résultat de la recherche.
    • Sinon, si l'ensemble contient uniquement des méthodes, ce groupe de méthodes est le résultat de la recherche.
    • Sinon, la recherche est ambiguë et une erreur de liaison survient.

Depuis C# ne considère pas les opérateurs de conversion dans le processus de résolution de membre, votre seule option est d'ajouter la méthode à votre classe, soit directement, soit par une extension.

+0

Merci. On dirait que je vais ajouter un tas de fonctions pour appeler les fonctions de chaîne. –

3

Vous pouvez create a extension method prendre cette clé comme paramètre.

namespace ExtensionMethods 
{ 
    public static class Utilities 
    { 
    public static bool ValueEndsWith(this Key key, ref string valueToCheck) 
    { 
     return key.Id.EndsWith(valueToCheck); 
    } 
    } 
} 

Vous pouvez l'appeler comme Key.ValueEndsWith(ref valueString);

+0

Oh, je n'étais pas clair sur ce que je voulais appeler directement les fonctions de chaîne. Ne crée pas un ensemble de fonctions qui appelle les différentes fonctions de chaîne. –