В моем случае лучше использовать отражение?Я разрабатываю библиотеку для работы с 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; }
}
Какой способ лучше использовать?