Получить значение свойства из строки, используя отражение в C #

Включенная страница:

<!-- opening and closing tags of included page -->
<ui:composition ...>
</ui:composition>

Включая страницу:

<!--the inclusion line in the including page with the content-->
<ui:include src="yourFile.xhtml"/>
  • Вы запускаете прилагаемый файл xhtml с помощью ui:composition, как показано выше.
  • Вы включаете этот файл с ui:include в включающий файл xhtml, как показано выше.
806
задан GlenH7 14 August 2014 в 18:37
поделиться

5 ответов

 public static object GetPropValue(object src, string propName)
 {
     return src.GetType().GetProperty(propName).GetValue(src, null);
 }

Конечно, вы захотите добавить проверку и еще много чего, но в этом суть .

1659
ответ дан 22 November 2019 в 21:09
поделиться

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

using System.Reflection;
public object GetPropValue(string prop)
{
    int splitPoint = prop.LastIndexOf('.');
    Type type = Assembly.GetEntryAssembly().GetType(prop.Substring(0, splitPoint));
    object obj = null;
    return type.GetProperty(prop.Substring(splitPoint + 1)).GetValue(obj, null);
}

Обратите внимание, что я отметил объект, который проверяется, с помощью локальной переменной obj. null означает статический, в противном случае установите его на то, что хотите. Также обратите внимание, что GetEntryAssembly() является одним из немногих доступных методов для получения "запущенной" сборки, вы можете поиграть с ним, если вам трудно загрузить тип.

.
2
ответ дан 22 November 2019 в 21:09
поделиться

А как насчет использования CallByName из пространства имен Microsoft.VisualBasic (Microsoft.VisualBasic.dll)? Оно использует отражение для получения свойств, полей и методов обычных объектов, COM-объектов и даже динамических объектов.

using Microsoft.VisualBasic;
using Microsoft.VisualBasic.CompilerServices;

и затем

Versioned.CallByName(this, "method/function/prop name", CallType.Get).ToString();
43
ответ дан 22 November 2019 в 21:09
поделиться

Как насчет чего-то подобного:

public static Object GetPropValue(this Object obj, String name) {
    foreach (String part in name.Split('.')) {
        if (obj == null) { return null; }

        Type type = obj.GetType();
        PropertyInfo info = type.GetProperty(part);
        if (info == null) { return null; }

        obj = info.GetValue(obj, null);
    }
    return obj;
}

public static T GetPropValue<T>(this Object obj, String name) {
    Object retval = GetPropValue(obj, name);
    if (retval == null) { return default(T); }

    // throws InvalidCastException if types are incompatible
    return (T) retval;
}

Это позволит вам опуститься в свойства, используя одну строку, например:

DateTime now = DateTime.Now;
int min = GetPropValue<int>(now, "TimeOfDay.Minutes");
int hrs = now.GetPropValue<int>("TimeOfDay.Hours");

Вы можете использовать эти методы как статические методы или расширения.

.
201
ответ дан 22 November 2019 в 21:09
поделиться
Dim NewHandle As YourType = CType(Microsoft.VisualBasic.CallByName(ObjectThatContainsYourVariable, "YourVariableName", CallType), YourType)
1
ответ дан 22 November 2019 в 21:09
поделиться
Другие вопросы по тегам:

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