Для вашего ответа JSON
{
"res": {
"status": {
"code": 0,
"message": "some message"
}
},
"somedata": {
"someid": "12345",
"sometext": "a text"
},
"anotherdata": {
"anotherid": "54321",
"anothertext": "b text"
}
}
Классами модели данных могут быть Somedata
data class Somedata(
val someid: String,
val sometext: String
)
Статус
data class Status(
val code: Int,
val message: String
)
Anotherdata
data class Anotherdata(
val anotherid: String,
val anothertext: String
)
[ 1110] Эти классы могут быть объединены для анализа всего ответа. GenericResponse
data class GenericResponse(
val anotherdata: Anotherdata,
val res: Res,
val somedata: Somedata
)
При дооснащении, например,
@POST("url")
fun callingMethod(@Field("username") username: String, @Field("password")
password: String): GenericResponse
Можно назвать MemberInfo. GetCustomAttributes () для получения любых пользовательских атрибутов, определенных на члене a Type
. Можно добраться MemberInfo
для свойства путем выполнения чего-то вроде этого:
PropertyInfo prop = typeof(Group).GetProperty("UserExistsInGroup",
BindingFlags.Public | BindingFlags.Static);
Попробуйте следующее
var property = typeof(Group).GetProperty("UserExistsInGroup");
var attribute = property.GetCustomAttributes(typeof(DescriptionAttribute), true)[0];
var description = (DescriptionAttribute)attribute;
var text = description.Description;
Хорошо, я видел Ваше редактирование, я не уверен, что можно сделать это с дополнительными методами, поскольку они были бы anaware типа содержания класса.
Это собирается звучать немного дурацким, но как насчет того, чтобы создать новый класс a "DescribedInt", который имел бы неявный оператор броска, чтобы позволить Вам использовать его в качестве интервала автоматически? Вы сможете использовать в значительной степени, как Вы описываете. У Вас все еще будет описание, но когда необходимо будет использовать его как Интервал, Вы, привычка' должна получить.Data свойство...
например:
private void ExampleUse()
{
int myvalue = Group.A; //see, no need to cast or say ".Data" - implicit cast
string text = Group.A.Description;
//действительно наполните значениями...}
public static class Group
{
public static DescribedInt A = new DescribedInt(12, "some description");
public static DescribedInt B = new DescribedInt(88, "another description");
}
public class DescribedInt
{
public readonly int data;
public readonly string Description;
public DescribedInt(int data, string description)
{
this.data = data;
this.Description = description;
}
//automatic cast to int
public static implicit operator int(DescribedInt orig)
{
return orig.data;
}
//public DescribedInt(string description)
//{
// this.description = description;
//}
//if you ever need to go the "other way"
//public static implicit operator DescribedInt(int orig)
//{
// return new DescribedInt(orig, "");
//}
}
Вот вспомогательный класс, который я использую для обработки пользовательских атрибутов в . NET
public class AttributeList : List<Attribute>
{
/// <summary>
/// Gets a list of custom attributes
/// </summary>
/// <param name="propertyInfo"></param>
/// <returns></returns>
public static AttributeList GetCustomAttributeList(ICustomAttributeProvider propertyInfo)
{
var result = new AttributeList();
result.AddRange(propertyInfo.GetCustomAttributes(false).Cast<Attribute>());
return result;
}
/// <summary>
/// Finds attribute in collection by its type
/// </summary>
/// <typeparam name="T"></typeparam>
/// <returns></returns>
public T FindAttribute<T>() where T : Attribute
{
return (T)Find(x => typeof(T).IsAssignableFrom(x.GetType()));
}
public bool IsAttributeSet<T>() where T : Attribute
{
return FindAttribute<T>() != null;
}
}
Также юнит-тесты для MsTest, показывающие, как использовать этот класс
[TestClass]
public class AttributeListTest
{
private class TestAttrAttribute : Attribute
{
}
[TestAttr]
private class TestClass
{
}
[TestMethod]
public void Test()
{
var attributeList = AttributeList.GetCustomAttributeList(typeof (TestClass));
Assert.IsTrue(attributeList.IsAttributeSet<TestAttrAttribute>());
Assert.IsFalse(attributeList.IsAttributeSet<TestClassAttribute>());
Assert.IsInstanceOfType(attributeList.FindAttribute<TestAttrAttribute>(), typeof(TestAttrAttribute));
}
}
http://www.kozlenko.info/2010/02/02/getting-a-list-of-custom-attributes-in-net/