2011-03-15 60 views
3

我必须从配置文件中添加大量共享文件夹。名称很长,但都以“名称”,“域名”,“用户名”和“密码”结尾。如何将字符串转换为变量引用?

一个例子是:

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

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

回答

2

有一个在C#没有办法做的eval(“...”),语言不是那动态。因此,你在方法中的最后一次尝试将不起作用。

我会去

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

或者,你可以使用字符串的道路上,但真的会下降错车道..

1

你可以使用反射和戳穿,但在这种情况下它是非常糟糕的编程实践。

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

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); 
相关问题