2013-03-06 2 views
0

У меня есть частичный класс, созданный с помощью веб-службы. Добавить ModelMetadata к этому классу, как так:Получить все свойства с помощью ModelMetadata

// Automatically generated code 

public partial class MyClass 
{ 
    public string FIELD_ONE ... 
    public DateTime? FIELD_TWO ... 
} 

// My code 

[MetadataType(typeof(MyMetaDataClass))] 
public partial class MyClass 
{ 
} 

public class MyMetaDataClass 
{ 
    [Display(Name="Field One")] 
    public string FIELD_ONE; 

    [Display(Name="Field Two")] 
    public DateTime? FIELD_TWO; 
} 

Теперь я хотел бы получить все свойства, которые имеют MyClass метаданных отображения атрибутов, т.е. FIELD_ONE и FIELD_TWO.

Я пытался что-то вроде

typeof(MyClass).GetProperties().Where(p => Attribute.IsDefined(typeof(DisplayAttribute)) 

Но, конечно, атрибут не на свойствах MyClass. Я также попытался:

ModelMetadata mmd = ModelMetadata.FromLambdaExpression(m => pi.GetValue(m, null), Html.ViewData); 

Но я получаю сообщение об ошибке «Шаблоны могут быть использованы только с доступом поля, доступ к собственности, одномерный индекс массива или одного параметра выражений пользовательских индексатор.»

Если бы я мог получить от MyClass до MyMetadataClass Тогда я мог бы получить имена свойств этого и получить свойства с таким же именем от MyClass.

Возможно ли это, или я лаю неправильное дерево?

+0

проверить это на это, я уже ответил на этот вопрос здесь http://stackoverflow.com/a/24757520/3050647 – elia07

ответ

1

Что именно вы пытаетесь сделать? Если вы хотите переопределить то, что делает поставщик метаданных по умолчанию, то вы, вероятно, лучше не заменяете DataAnnotationsModelMetadataProvider своей собственной реализацией. Вот несколько примеров кода:

http://buildstarted.com/2010/09/14/creating-your-own-modelmetadataprovider-to-handle-custom-attributes/

Здесь автор добавляет поддержку для своих собственных пользовательских атрибутов, но вы можете так же легко переопределить implemntation по умолчанию для DisplayAttribute.

Если это не поможет, предоставьте более подробную информацию о том, чего вы пытаетесь достичь.

+0

В примере я хочу, чтобы иметь возможность перебирать '' FIELD_ONE' и FIELD_TWO' на Объект MyClass автоматически. –