Похоже, вы хотите иметь возможность декорировать существующие члены частичного класса, предоставляя метаданные в виде отдельной частичной части. Для этого нет встроенного механизма (см., Например, этот вопрос и классы, упомянутые в ответе ), но если вы хотите придерживаться соглашения, вы можете выполнить свой собственный:
Итак, предположим, у нас есть
public partial class SpGetProfileInfoResult
{
public string FName { get; set; }
}
в части, которую мы не можем изменить, и
public partial class SpGetProfileInfoResult
{
internal class Metadata
{
[System.ComponentModel.DisplayNameAttribute("[BILL-FNAME]")]
public string FName { get; set; }
}
}
в части, которую мы можем изменить. У вас уже есть большинство частей: в DisplayName()
вы успешно определили, что мы смотрим на свойство FName
; Затем вы ищете DisplayNameAttribute
на T.FName
, но его нет, так что на этом все и заканчивается.
Что вам нужно сделать, в случае, если вы не нашли нужный атрибут,
var attr = memberInfo.GetAttribute<DisplayNameAttribute>(false);
if (attr == null)
{
Найдите вложенный класс с именем Metadata
- обратите внимание, здесь мы используем одно место BindingFlags.NonPublic
// Try and get a nested metadata class
var metadataType = typeof(T)
.GetNestedType("Metadata",
BindingFlags.Public | BindingFlags.NonPublic);
Если мы найдем один:
if (metadataType != null)
{
Ищите члена с тем же именем, о котором первоначально говорили (снова BindingFlags.NonPublic
)
var membersOnMetadataType = metadataType.GetMember(memberInfo.Name,
BindingFlags.Instance |
BindingFlags.Public |
BindingFlags.NonPublic);
Если есть, используйте ваш вспомогательный метод, но на этот раз передайте ему член типа метаданных:
if (membersOnMetadataType.Any())
{
var attrOnMetadataType = membersOnMetadataType[0]
.GetAttribute<DisplayNameAttribute>(false);
return attrOnMetadataType.DisplayName;
(здесь я пропустил окончательную проверку недействительности, а также закрытие потока управления)
В зависимости от того, насколько неприятным вы находите эту строку "Metadata"
, вы можете вместо этого сделать что-то декларативное с атрибутами:
- имеет атрибут уровня класса, который продолжается
SpGetProfileInfoResult
(часть, которую вы можете изменить), которая указывает на его Metadata
, используя typeof
(это подход, принятый System.ComponentModel
) или
- имеет атрибут уровня класса, который продолжается
Metadata
, чтобы он утверждал: «Я - тип метаданных». Тогда вместо поиска вложенного класса с именем фиксированной строки мы вместо этого ищем вложенный класс, имеющий этот конкретный атрибут.