如何将字符串转换为变量引用?

3

我需要从一个配置文件中添加很多共享文件夹。这些文件夹的名称非常长,但都以“Name”、“Domain”、“Username”和“Password”结尾。

例如:

AddSharedFolder(
  myConfigurationHandler.MyConfiguration.MyService.RSController.repositoryName,
  myConfigurationHandler.MyConfiguration.MyService.RSController.repositoryDomain,
  myConfigurationHandler.MyConfiguration.MyService.RSController.repositoryUsername,
  myConfigurationHandler.MyConfiguration.MyService.RSController.repositoryPassword);

我的想法是将其命名为

AddSharedFolder(
  "myConfigurationHandler.MyConfiguration.MyService.RSController.repository");

然后有一个重载的AddSharedFolders方法:
private static void AddSharedFolder(string prefix)
{
   AddSharedFolder(prefix + "Name", prefix + "Domain", prefix + "Username", prefix + "Password");
}

显然,最后一种方法是错误的。但我如何将字符串转换为变量名?或者这是一种非常愚蠢的编程实践吗?
4个回答

2

在C#中没有Eval("...")这样的方法,因为该语言不够动态。因此,你最后尝试的方法是行不通的。

我建议使用以下方法:

var ctr = myConfigurationHandler.MyConfiguration.MyService.RSController;
AddSharedFolder(ctr.repositoryName, ctr.repositoryDomain,
                ctr.repositoryUsername, ctr.repositoryPassword);

或者,您可以使用字符串来表示路径,但那真的是走错了方向。


1

做类似这样的事情不是更容易(而且不会牺牲类型安全性):

var controller = myConfigurationHandler.MyConfiguration.MyService.RSController;

AddSharedFolder( controller.repositoryName, controller.repositoryDomain, controller.repositoryUsername, controller.repositoryPassword);

1

这不是正确的做法。正确的方法是为定义属性的类型引入一个变量。就像这样:

var controller = myConfigurationHandler.MyConfiguration.MyService.RSController;

AddSharedFolder(
  controller.repositoryName,
  controller.repositoryDomain,
  controller.repositoryUsername,
  controller.repositoryPassword);

1
你可以使用反射并且试探一下,但在这种情况下,这是非常糟糕的编程实践。
如果不想使用这些长名称,那么请将您的设置封装在更易于处理并接受该类中的长名称的东西中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接