C# 在维护私有列表的同时公开方法的最佳方式
C# Best way to expose a method while maintaining a private list
我实际上是在尝试从对象列表中撤回自定义 class 而不公开我的列表。下面是我是如何让它工作的,但我认为这不是最优雅的方式。另外 - 如何在不实例化新 class 的情况下调用此调用的实例?我想在一行中完成所有事情。
我希望能够在一行中调用我的请求
Library.ConnectionController cc = new Library.ConnectionController();
cc = cc.Request("z");
这是我的 class
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"
}
});
}
}
}
}
这是您以更简单的方式编写的代码版本
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");
我不明白你到底想要什么。但这里是使用一些基本思想的更正版本:
- 使用
static
方法检索controller
。由于找不到具有请求名称的 controller
,我们需要调用一些外部请求函数。所以最好的办法就是让static
函数变成returned type
.
- 在 InternalLibrary 中使用静态
list
,因此它只会被创建(或评估)一次。
- 使用
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");
P.S。我没有删除 InternalLibrary
class 假设这不仅仅是一个硬编码列表,而是具有一些分离逻辑的复杂 class。
我实际上是在尝试从对象列表中撤回自定义 class 而不公开我的列表。下面是我是如何让它工作的,但我认为这不是最优雅的方式。另外 - 如何在不实例化新 class 的情况下调用此调用的实例?我想在一行中完成所有事情。
我希望能够在一行中调用我的请求
Library.ConnectionController cc = new Library.ConnectionController();
cc = cc.Request("z");
这是我的 class
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"
}
});
}
}
}
}
这是您以更简单的方式编写的代码版本
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");
我不明白你到底想要什么。但这里是使用一些基本思想的更正版本:
- 使用
static
方法检索controller
。由于找不到具有请求名称的controller
,我们需要调用一些外部请求函数。所以最好的办法就是让static
函数变成returned type
. - 在 InternalLibrary 中使用静态
list
,因此它只会被创建(或评估)一次。 - 使用
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");
P.S。我没有删除 InternalLibrary
class 假设这不仅仅是一个硬编码列表,而是具有一些分离逻辑的复杂 class。