как получить имя класса во время выполнения из метода generi c, который находится в другом классе? - PullRequest
1 голос
/ 20 июня 2020

Я пытаюсь сгенерировать свой базовый URL-адрес с помощью UriBuilder. Я создал общий c «GetRequestUrl», который находится в моем классе TestUtil. Как я могу получить имя моего тестового класса во время выполнения с помощью этого метода и добавить его к строке serviceAPI

// Вот метод GetRequestUrl в моем классе TestUtil

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

}

}

1 Ответ

0 голосов
/ 20 июня 2020

Вам необходимо передать класс в качестве параметра GetRequestUrl или строку, которую вы хотите добавить. Строка лучше, потому что она избавляет вас от необходимости изменять код в будущем, чтобы приспособиться к другой практике. Чтобы сделать это так, как вам кажется, нужно использовать отражение, чего следует избегать, если вы можете сделать это таким образом:

public class TestUtil
{
    public string GetRequestUrl(string testType, string serviceName)
    {
        string 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;

        return uri.ToString();
    }
}

public class TestClass
{
    TestUtil util = new TestUtil();
    [Test]
    public void Method1()
    {
        string fullUrl = util.GetRequestUrl(this.GetType().ToString(), "APIServiceName");
    }
}

Другой вариант - передать его в конструктор и сохранить в качестве частной переменной, которая централизует данные, чтобы вы могли передать их только один раз. Использование интерфейса предпочтительнее класса:

Использование метода интерфейса:

// An empty interface is fine.
// TestUtil will then require a ServiceAPI for it to be created using it's 
// constructor as a guarantee.
public interface IServiceAPI { }  

using System.Reflection;
public class TestUtil
{
    private _service;
    
    // TestUtil requires a ServiceAPI class.
    public TestUtil (IServiceAPI service) 
    {
        _service = service;
    }
    
    public string GetRequestUrl(string serviceName)
    {
        string serviceAPI = _service.GetType().Name; // Get the class 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();
    }
}
// implement the IServiceAPI interface on TestClass.
public class TestClass : IServiceAPI 
{
    // passing in TestClass here using "this".
    TestUtil util = new TestUtil(this); 
    
    [Test]
    public void Method1()
    {
        string fullUrl = util.GetRequestUrl("APIServiceName");
    }
}
...