2016-05-14 4 views
0

Ich versuche im Wesentlichen, eine benutzerdefinierte Klasse aus einer Liste von Objekten zurückzuziehen, ohne meine Liste freizulegen. Unten ist, wie ich es zur Arbeit gebracht habe, aber ich denke nicht, dass dies der eleganteste Weg ist. Außerdem - wie rufe ich eine Instanz dieses Aufrufs auf, ohne eine neue Klasse zu instanziieren? Ich möchte alles in einer Linie machen.C# Die beste Methode, eine Methode unter Beibehaltung einer privaten Liste verfügbar zu machen

Ich möchte in der Lage sein, meine Anfrage in einer Linie zu nennen

Library.ConnectionController cc = new Library.ConnectionController(); 
cc = cc.Request("z"); 

Und hier ist meine Klasse

class Library 
{ 
    public ConnectionController Retrieve_Controller_By_Domain(string Domain) 
    { 
     ConnectionController cc = new ConnectionController(); 
     cc = cc.Request(Domain); 
     return cc; 
    } 

    internal class ConnectionController 
    { 
     public string UserName { get; set; } 
     public string Password { get; set; } 
     public string ProjectName { get; set; } 
     public string Domain { get; set; } 
     public string SQLServer { get; set; } 
     public string SQLDatabase { get; set; } 

     public ConnectionController Request(string Domain) 
     { 
      InternalLibrary il = new InternalLibrary(); 
      ConnectionController Requested = il.ccList.Where(m => m.Domain.ToUpper() == Domain.ToUpper()) 
       .Select(m => new ConnectionController 
       { 
        UserName = m.UserName, 
        Password = m.Password, 
        ProjectName = m.ProjectName, 
        Domain = m.Domain, 
        SQLServer = m.SQLServer, 
        SQLDatabase = m.SQLDatabase 
       }).ToList()[0]; 

      return Requested; 
     } 
    } 

    private class InternalLibrary 
    { 
     public List<ConnectionController> ccList 
     { 
      get 
      { 
       return (new List<ConnectionController> { 
        new ConnectionController() { 
         UserName = "x", 
         Password="y", 
         ProjectName="r", 
         Domain = "z", 
         SQLDatabase = "a", 
         SQLServer = "b" 
        } 
       }); 
      } 
     } 
    } 
} 

Antwort

0

Dies ist eine Version des Codes in einer einfacheren Art und Weise geschrieben ist

namespace Library 
{ 
public class ConnectionController 
{ 
    private static readonly List<ConnectionController> CcList = new List<ConnectionController> 
    { 
     new ConnectionController 
     { 
      UserName = "x", 
      Password = "y", 
      ProjectName = "r", 
      Domain = "z", 
      SQLDatabase = "a", 
      SQLServer = "b" 
     } 
    }; 

    public string UserName { get; set; } 
    public string Password { get; set; } 
    public string ProjectName { get; set; } 
    public string Domain { get; set; } 
    public string SQLServer { get; set; } 
    public string SQLDatabase { get; set; } 

    public static ConnectionController Request(string domain) 
    { 
     return CcList.Where(m => m.Domain.ToUpper() == domain.ToUpper()) 
      .Select(m => new ConnectionController 
      { 
       UserName = m.UserName, 
       Password = m.Password, 
       ProjectName = m.ProjectName, 
       Domain = m.Domain, 
       SQLServer = m.SQLServer, 
       SQLDatabase = m.SQLDatabase 
      }).ToList()[0]; 
    } 
} 
} 

dann könnte man

var requesteed = ConnectionController.Request("x"); 
0

Ich habe nicht genau verstanden, was Sie wollen. Aber hier ist korrigierte Version einige grundlegende Ideen mit:

  1. Mit static Methode controller abzurufen. Da keine controller mit dem angeforderten Namen gefunden werden kann, müssen wir einige externe Anfragefunktion aufrufen. Also ist der beste Weg, es static Funktion der returned type zu machen.
  2. Mit statischen list in InternalLibrary so wird es nur einmal erstellt (oder ausgewertet).
  3. Mit FirstOrDefault()LINQ Erweiterungsmethode, da es leeres Ergebnis geben könnte. Hier

ist der Code:

public class Library 
{ 
    public class ConnectionController 
    { 
     public string UserName { get; set; } 
     public string Password { get; set; } 
     public string ProjectName { get; set; } 
     public string Domain { get; set; } 
     public string SQLServer { get; set; } 
     public string SQLDatabase { get; set; } 

     public static ConnectionController Request(string Domain) 
     { 
      return InternalLibrary.ccList. 
       Where(m => m.Domain.Equals(Domain, 
          StringComparison.CurrentCultureIgnoreCase)). 
       FirstOrDefault(); 
     } 
    } 

    private class InternalLibrary 
    { 
     public static readonly List<ConnectionController> ccList = 
      new List<ConnectionController> 
      { 
       new ConnectionController() 
       { 
        UserName = "x", 
        Password="y", 
        ProjectName="r", 
        Domain = "z", 
        SQLDatabase = "a", 
        SQLServer = "b" 
       } 
      }; 
    } 
} 

Und Sie können dies wie folgt verwenden (beachten Sie, dass controllernull sein könnte)

var controller = Library.ConnectionController.Request("z"); 

P. S. Ich habe die Klasse InternalLibrary nicht entfernt, wenn man annimmt, dass dies nicht nur eine hart codierte Liste ist, sondern eine komplexe Klasse mit einigen getrennten Logiken.

Verwandte Themen