c# - 如何在运行时从另一个类中的泛型方法获取类名?
问题描述
我正在尝试使用 UriBuilder 生成我的 baseurl。我在我的 TestUtil 类中创建了一个通用的“GetRequestUrl”。如何使用此方法在运行时获取我的测试类的名称并附加到字符串 serviceAPI
//这是我的TestUtil类中的GetRequestUrl方法
public class TestUtil
{
public string GetRequestUrl(string serviceName)
{
string serviceAPI = this.GetType().BaseType.Name;
var requestUrl = new UriBuilder();
requestUrl.Scheme = "http";
requestUrl.Host = "svc-" + serviceName + "." +
ConfigurationManager.AppSettings["TestEnvironment"] + "-example.com/api/";
requestUrl.Path = serviceAPI;
Uri uri = requestUrl.Uri;
return uri.ToString();
}
}
//这是我的测试类,我希望在运行时将类名“TestClass”附加到 serviceAPI 字符串,但我得到的是 TestUtil。我试过跟随..
this.GetType().Name;
this.GetType().BaseType.Name;
MethodBase.GetCurrentMethod().DeclaringType.Name;
public class TestClass
{
TestUtil util = new TestUtil();
[Test]
public void Method1()
{
string fullUrl = util.GetRequestUrl("APIServiceName");
}
}
解决方案
您需要将一个类作为参数传递给 GetRequestUrl,或者您要附加的字符串。字符串更好,因为它可以防止您将来需要更改代码以采用不同的做法。要按照您想要的方式进行操作,就是使用反射,如果您可以这样做,则应避免使用反射:
公共类TestUtil { 公共字符串 GetRequestUrl(字符串 testType,字符串 serviceName) { 字符串 serviceAPI = testType; var requestUrl = new UriBuilder(); requestUrl.Scheme = "http"; requestUrl.Host = "svc-" + serviceName + "." + ConfigurationManager.AppSettings["TestEnvironment"] + "-example.com/api/"; requestUrl.Path = serviceAPI; uri uri = requestUrl.Uri; 返回 uri.ToString(); } } 公共类TestClass { TestUtil util = new TestUtil(); [测试] 公共无效方法1() { string fullUrl = util.GetRequestUrl(this.GetType().ToString(), "APIServiceName"); } }
另一种选择是在构造函数中传递它并将其存储为私有变量,该变量集中数据,以便您只传递一次。使用接口比使用类更可取:
使用接口方法:
// 一个空的接口就可以了。 // 然后 TestUtil 将需要一个 ServiceAPI 来使用它来创建它 // 构造函数作为保证。 公共接口 IServiceAPI { } 使用 System.Reflection; 公共类TestUtil { 私人服务; // TestUtil 需要一个 ServiceAPI 类。 公共 TestUtil(IServiceAPI 服务) { _service = 服务; } 公共字符串 GetRequestUrl(字符串服务名称) { 字符串 serviceAPI = _service.GetType().Name; // 获取类名。 var requestUrl = new UriBuilder(); requestUrl.Scheme = "http"; requestUrl.Host = "svc-" + serviceName + "." + ConfigurationManager.AppSettings["TestEnvironment"] +“-example.com/api/”; requestUrl.Path = serviceAPI; uri uri = requestUrl.Uri; 返回 uri.ToString(); } } // 在 TestClass 上实现 IServiceAPI 接口。 公共类TestClass:IServiceAPI { // 在这里使用“this”传入TestClass。 TestUtil util = new TestUtil(this); [测试] 公共无效方法1() { string fullUrl = util.GetRequestUrl("APIServiceName"); } }
推荐阅读
- javascript - 无法访问请求承诺响应中的值
- java - 从 Java 中的注释部分读取值
- node.js - 如何根据可以动态插入的文件夹路径提供文件
- c++ - g ++编译器中奇怪的缩小转换双浮点警告
- flutter - 如何解决颤振中的 showDatePicker 区域(在 null 上调用了方法“formatFullDate”。)
- linux - Linux:安静模式以及如何让命令在下一个之前等待完成
- r - 计算 R 中数据框中每对分类单元之间的差异
- regex - 使用 letf 和 right 跨度捕获字符串模式,不包括此模式
- ios - SwiftUI:在主视图上显示模态(实际上不是模态)视图时,如何限制视图的可点击区域?
- c++ - 如何在调用 C++ 析构函数时优雅地停止/销毁具有阻塞调用的线程?