如何将字符串类名称作为类[关闭]传递或对待

问题描述 投票:-1回答:1
我有以下代码,其中className是我需要作为类传递的字符串值,这样可以避免编写多个switch-case语句。

[When(@"Execute Request with model ""(.*)""")] public void WhenExecuteRequestWithModel(string className) { switch (className) { case "Customer": if (_settings.Request.Method == Method.GET) _settings.Response = _settings.RestClient.Execute<Customer>(_settings.Request); else _settings.Response = _settings.RestClient.ExecuteAsyncRequest<Customer>(_settings.Request).GetAwaiter().GetResult(); break; case "CustomerStatus": if (_settings.Request.Method == Method.GET) _settings.Response = _settings.RestClient.Execute<CustomerStatus>(_settings.Request); else _settings.Response = _settings.RestClient.ExecuteAsyncRequest<CustomerStatus>(_settings.Request).GetAwaiter().GetResult(); break; } }

请帮助
c# generics bdd
1个回答
3
投票
似乎您正在尝试将其与Specflow绑定,因此只能传递一个字符串。如果传递的className是类的全名,或者如果您能够推断出类的全名(例如,通过在名称空间前添加名称),则应该能够使用Reflection实例化适当的泛型方法。

但是,坦率地说,您最好坚持使用switch语句。无论哪种方式,您都应该能够通过创建一个辅助方法来减少重复代码。

switch (className) { case "Customer": ExecuteRestMethod<Customer>() break; case "CustomerStatus": ExecuteRestMethod<CustomerStatus>(); break; } public void ExecuteRestMethod<T>() { if (_settings.Request.Method == Method.GET) _settings.Response = _settings.RestClient.Execute<T>(_settings.Request); else _settings.Response = _settings.RestClient.ExecuteAsyncRequest<T>(_settings.Request).GetAwaiter().GetResult(); }

© www.soinside.com 2019 - 2024. All rights reserved.