Как получить доступ к атрибуту Описания или на свойстве или на константе в C#?

Для вашего ответа 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
18
задан Community 23 May 2017 в 12:16
поделиться

4 ответа

Можно назвать MemberInfo. GetCustomAttributes () для получения любых пользовательских атрибутов, определенных на члене a Type. Можно добраться MemberInfo для свойства путем выполнения чего-то вроде этого:

PropertyInfo prop = typeof(Group).GetProperty("UserExistsInGroup",
    BindingFlags.Public | BindingFlags.Static);
5
ответ дан 30 November 2019 в 07:50
поделиться

Попробуйте следующее

var property = typeof(Group).GetProperty("UserExistsInGroup");
var attribute = property.GetCustomAttributes(typeof(DescriptionAttribute), true)[0];
var description = (DescriptionAttribute)attribute;
var text = description.Description;
23
ответ дан 30 November 2019 в 07:50
поделиться

Хорошо, я видел Ваше редактирование, я не уверен, что можно сделать это с дополнительными методами, поскольку они были бы 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, "");
    //}
}
2
ответ дан 30 November 2019 в 07:50
поделиться

Вот вспомогательный класс, который я использую для обработки пользовательских атрибутов в . 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/

2
ответ дан 30 November 2019 в 07:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: