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

时间:2011-03-15 09:38:40

标签: c#

我必须从配置文件中添加许多共享文件夹。名称很长,但都以“姓名”,“域名”,“用户名”和“密码”结尾。

一个例子是:

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 个答案:

答案 0 :(得分:2)

C#中没有办法做Eval(“...”),语言不是那么动态。因此,您对方法的最后一次尝试将无效。

我会去

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

或者,您可以使用字符串作为路径,但这确实会走错路线..

答案 1 :(得分:1)

你可以使用反射和捅,但在这种情况下编程实践真的很糟糕。

如果您不想使用这些长名称,请将您的设置包含在易于处理的内容中,并接受该类中的长名称。

答案 2 :(得分:1)

做某些事情并不容易(而不是牺牲类型安全性):

var controller = myConfigurationHandler.MyConfiguration.MyService.RSController;

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

答案 3 :(得分:1)

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

var controller = myConfigurationHandler.MyConfiguration.MyService.RSController;

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