Использование отражения для полей - PullRequest
0 голосов
/ 23 февраля 2019

В моем случае лучше использовать отражение?Я разрабатываю библиотеку для работы с vk API.Мой код для базового класса, который создает URI для запросов:

public abstract class VkApiMethod : IVkApiMethod
{
    private string _apiUri = "https://api.vk.com/method/",
                   _apiVersion = "5.92";

    public VkApiMethod(string AccessToken)
    {
        this.AccessToken = AccessToken;
        Fields = new string[] { };
    } 

    public string VkApiMethodName { get; protected set; }

    public string AccessToken { get; set; }

    public string[] Fields { get; set; }

    protected abstract string GetMethodApiParams();

    public string GetRequestString()
    {
        return string.Format("{0}{1}?access_token={2}&fields={3}{4}&v={5}", _apiUri,
                                                                         VkApiMethodName,
                                                                         AccessToken,
                                                                         ArrayToString(Fields),
                                                                         GetMethodApiParams(),
                                                                         _apiVersion);
    } 
}

VkApiMethod является базовым классом.Производный класс должен переопределить метод GetMethodApiParams().GetRequestString() вызовите GetMethodApiParams(), чтобы получить params производного класса.
Например,

class GetUsers : VkApiMethod
{
    public GetUsers(string AccessToken)
        : base(AccessToken)
    {
        VkApiMethodName = "users.get";
    } 
    /// <summary>
    /// Идентификаторы пользователей или их короткие имена.
    /// </summary>
    public string[] UserIDs { get; set; }

    protected override string GetMethodApiParams()
    {
        return string.Format("&user_ids={0}", ArrayToString(UserIDs));
    }
}

И еще один способ без GetMethodApiParams() метода с использованием отражения:

public string GetRequestString()
{
    var @params = from p in this.GetType().GetProperties()
                  let attr = p.GetCustomAttributes(typeof(RequestParamAttr), true)
                  where attr.Length == 1
                  select new
                  {
                      PropValue = p.GetValue(this),
                      AttrName = (attr.First() as RequestParamAttr).ParamName
                  };

    var _reqUriParams = "";
    foreach (var param in @params)
        _reqUriParams += string.Format("&{0}={1}", param.AttrName, param.PropValue);

    return string.Format("{0}{1}?access_token={2}{3}&v={4}", _apiUri,
                                                             VkApiMethodName,
                                                             AccessToken,
                                                             _reqUriParams,
                                                             _apiVersion);
}

Пример производного класса:

class GetUsers : VkApiMethod
{
    public GetUsers(string AccessToken)
        : base(AccessToken)
    {
        VkApiMethodName = "users.get";
    }

    /// <summary>
    /// Идентификаторы пользователей или их короткие имена.
    /// </summary>
    [RequestParamAttr("user_ids")]
    public string[] UserIDs { get; set; }
}  

Какой способ лучше использовать?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...