2015-10-07 5 views
3

Iv'e потратил последний час, пытаясь получить значение атрибута DisplayName, применяемого к Class.Получить значение атрибута DisplayName класса

Мне достаточно просто получить значения атрибутов из методов и свойств, но я борюсь с классом.

Может ли кто-нибудь помочь мне с этой относительно небольшой проблемой?

Пример ниже:

Класс

[DisplayName("Opportunity")] 
public class Opportunity 
{ 
    // Code Omitted 
} 

Переменная

var classDisplayName = typeof(T).GetCustomAttributes(typeof(DisplayNameAttribute),true).FirstOrDefault().ToString(); 

Я потратил много времени на MSDN и SO, но я предполагаю, что я что-то тупо просто не хватает.

В любом случае большой вопрос для будущих читателей слишком

Любая помощь очень ценится!

+1

Где именно находится "T"? Почему бы не 'typeof (Opportunity)'? Кроме того, какое значение имеет значение 'classDisplayName', или вы получаете сообщение об ошибке? – juharr

+0

Вам просто нужно 'var classDisplayName = typeof (Opportunity) .GetCustomAttribute (true) .DisplayName; ' –

+0

Нет ошибок, является частью гораздо более крупной системы. К тому времени, когда он доберется до этого момента, - это возможность. classDisplayName = System.ComponentModel.DisplayNameAttribute Добавлено; Я пытаюсь понять, что происходит. Код достаточно прочен для обработки. –

ответ

3

используя свой пример, который я получил это работает как это сделать:

var displayName = typeof(Opportunity).GetCustomAttributes(typeof(DisplayNameAttribute), true).FirstOrDefault() as DisplayNameAttribute; 

if (displayName != null) 
    Console.WriteLine(displayName.DisplayName); 

Этот выдаваемого "Opportunity".

Или для более общего, как вы, кажется, делают это:

public static string GetDisplayName<T>() 
{ 
    var displayName = typeof(T).GetCustomAttributes(typeof(DisplayNameAttribute), true).FirstOrDefault() as DisplayNameAttribute; 

    if (displayName != null) 
     return displayName.DisplayName; 

    return ""; 
} 

Использование:

string displayName = GetDisplayName<Opportunity>(); 

GetCustomAttributes() возвращает object[], так что вам нужно применить конкретный бросок первого перед получением доступа к требуемые значения свойств.

+0

Мне понравился ваш ответ раньше, но теперь вы значительно улучшили его. Наконец, хорошее использование «как». Хороший ответ. Так что в основном мне просто не хватало «DisplayName» –

+0

Вам не хватало отображаемого имени и приведения к 'DisplayNameAttribute' – Ric

+0

Да, извините, а актерский состав ... * Опечатка * Не менее хорошая работа. –

1

Вместо ToString вам нужно получить доступ к объекту DisplayName. Вы можете сделать это путем литья до DisplayNameAttribute.

var classDisplayName = 
    ((DisplayNameAttribute) 
    typeof(Opportunity).GetCustomAttributes(typeof(DisplayNameAttribute), true).FirstOrDefault()).DisplayName; 
0

Попробуйте это:

var classDisplayName = ((DisplayNameAttribute)typeof(Opportunity).GetCustomAttributes(typeof(DisplayNameAttribute), true).FirstOrDefault()).DisplayName; 

Console.WriteLine(classDisplayName); 
0

Некоторые действительные решения уже существуют, но вы также можете создать метод расширения, как это:

using System.ComponentModel.DataAnnotations; 
using System.Reflection; 


public static class PropertyExtension 
{ 
    public static string GetDisplayName<T>(this string property) 
    { 
     MemberInfo propertyInfo = typeof(T).GetProperty(property); 
     var displayAttribute = propertyInfo?.GetCustomAttribute(typeof(DisplayAttribute)) as DisplayAttribute; 

     return displayAttribute != null ? displayAttribute.Name : ""; 
    } 
} 

способ использования это, предоставляя имя свойства в виде строки, а затем тип класса ,

var propertyNameInClass = "DateCreated"; // Could be any property 
// You could probably do something like nameof(myOpportunity.DateCreated) 
// to keep it strongly-typed 
var displayName = propertyNameInClass.GetDisplayName<Opportunity>(); 
if(!string.IsNullOrEmpty(displayName)) 
{ 
    // Do something 
} 

Я думаю, что это более динамично и чище, чем некоторые другие решения. Было бы неплохо обернуть все это с помощью инструкции try/catch из-за ее динамического характера.