【问题标题】:C# Best way to expose a method while maintaining a private listC# 在维护私有列表的同时公开方法的最佳方式
【发布时间】:2016-09-10 21:43:13
【问题描述】:

我实际上是在尝试从对象列表中拉回自定义类而不暴露我的列表。下面是我如何让它工作,但我认为这不是最优雅的方式。另外-如何在不实例化新类的情况下调用此调用的实例?我想在一行中完成所有操作。

我希望能够在一行中调用我的请求

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

这是我的课

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"
                    }
                });
            }
        }
    }
}

【问题讨论】:

    标签: c# list private


    【解决方案1】:

    这是以更简单的方式编写的代码版本

    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];
        }
    }
    }
    

    那么你可以

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

    【讨论】:

      【解决方案2】:

      我不明白你想要什么。但这里是使用一些基本思想的更正版本:

      1. 使用static 方法检索controller。由于找不到具有请求名称的controller,我们需要调用一些外部请求函数。所以最好的办法就是把它变成returned typestatic函数。
      2. 在 InternalLibrary 中使用静态 list,因此只会创建(或评估)一次。
      3. 使用FirstOrDefault() LINQ 扩展方法,因为结果可能为空。

      代码如下:

      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"
                      }
                  };
          }
      }
      

      你可以像这样使用它(注意controller可能是null

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

      附:我没有删除 InternalLibrary 类,假设这不仅仅是一个硬编码列表,而是具有一些分离逻辑的复杂类。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-10-13
        • 2021-12-19
        • 2010-09-30
        相关资源
        最近更新 更多