Получить значение из PropertyInfo без объекта - PullRequest
0 голосов
/ 23 октября 2018

Я использую отражение, чтобы получить все свои типы модификаторов из сборки, и помещаю их в словарь.

Я хочу посмотреть, какой контент получает модификатор.Каждый NodeContent имеет интерфейсы, чтобы сопоставить их с модификатором.Каждый модификатор имеет абстрактное свойство GetContentType, которое возвращает тип интерфейса, чтобы показать, какой контент он может взять.

Но это вынуждает меня создать объект типа для использования PropertyInfo.GetValue (), который бросает вызов тому, что япытаясь сделать, потому что я не знаю, какой тип контента он принимает.

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

Так что мой вопрос.Есть ли другой способ получить PropertyInfo.GetValue (), не используя объект, а просто тип?

public static Dictionary<string, Type> GetFittingModifiers(NodeContent content)
{
    Dictionary<string, Type> fits = new Dictionary<string, Type>();
    foreach(KeyValuePair<string,Type> modifierType in modifiers)
    {
        PropertyInfo propertyInfo = modifierType.Value.GetProperty("GetContentType");
        Modifier modifier = //make object of modifierType.Value without knowing what the constructor takes
        Type contentType = (Type)propertyInfo.GetValue(modifier, null);
        if (HasInterface(content, contentType))
            fits.Add(modifierType.Key, modifierType.Value);
    }
    return fits;
}

1 Ответ

0 голосов
/ 23 октября 2018

Не совсем понятно.

Чтобы получить значение свойства экземпляра, вам нужно вызвать метод доступа.Этот метод принимает this в качестве аргумента.Даже если он не строго требует , аргумент есть.Кроме того, чтобы эта работа работала вообще, свойство должно быть виртуальным, что снова означает, что вам нужен экземпляр определенного типа для вызова правильного метода.Вы можете подделать это, но это звучит так, будто ваш дизайн просто плохой, и теперь вам нужно найти быстрое решение.

Самый простой способ связать информацию о типе с любым значением - через атрибуты.Поэтому вместо использования виртуального свойства GetContentType вы определите ContentTypeAttribute, а затем примените его к целевому типу:

[ContentType(typeof(SomePlug))]
public class SomeModifier { ... }

Атрибуты применяются к типу, а не к экземпляру типа, поэтому вы можете легко их запросить:

var contentType = Attribute.GetCustomAttribute(modifier, typeof(ContentTypeAttribute));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...