1210 Stimmen

Abrufen des Eigenschaftswerts aus einer Zeichenkette mittels Reflexion

Ich versuche die Implementierung der Datentransformation mit Reflection 1 Beispiel in meinem Code.

Le site GetSourceValue Funktion hat einen Schalter, der verschiedene Typen vergleicht, aber ich möchte diese Typen und Eigenschaften entfernen und die GetSourceValue den Wert der Eigenschaft mit nur einer einzigen Zeichenkette als Parameter abrufen. Ich möchte eine Klasse und eine Eigenschaft in der Zeichenfolge übergeben und den Wert der Eigenschaft auflösen.

Ist dies möglich?

1 <a href="https://web.archive.org/web/20130815002453/http://msmvps.com/blogs/shahed/archive/2008/07/24/c-reflection-tips-data-transformation-using-reflection.aspx" rel="noreferrer">Webarchiv-Version des ursprünglichen Blogbeitrags</a>

20voto

testing Punkte 18753

Wenn ich den Code aus Ed S. Ich bekomme

ReflectionExtensions.GetProperty(Type, string)' ist aufgrund seiner Schutzstufe unzugänglich

Es scheint, dass GetProperty() ist in Xamarin.Forms nicht verfügbar. TargetFrameworkProfile est Profile7 in meiner portablen Klassenbibliothek (.NET Framework 4.5, Windows 8, ASP.NET Core 1.0, Xamarin.Android, Xamarin.iOS, Xamarin.iOS Classic).

Jetzt habe ich eine funktionierende Lösung gefunden:

using System.Linq;
using System.Reflection;

public static object GetPropValue(object source, string propertyName)
{
    var property = source.GetType().GetRuntimeProperties().FirstOrDefault(p => string.Equals(p.Name, propertyName, StringComparison.OrdinalIgnoreCase));
    return property?.GetValue(source);
}

Quelle

4 Stimmen

Nur eine kleine mögliche Verbesserung. Ersetzen Sie IF und next return durch: return property?.GetValue(source);

14voto

Derrick.X Punkte 325

Die nachstehende Methode funktioniert bei mir perfekt:

class MyClass {
    public string prop1 { set; get; }

    public object this[string propertyName]
    {
        get { return this.GetType().GetProperty(propertyName).GetValue(this, null); }
        set { this.GetType().GetProperty(propertyName).SetValue(this, value, null); }
    }
}

Um den Eigenschaftswert zu erhalten:

MyClass t1 = new MyClass();
...
string value = t1["prop1"].ToString();

Zum Einstellen des Eigenschaftswertes:

t1["prop1"] = value;

13voto

Matt Frear Punkte 48503

Die aufzurufende Methode hat sich im .NET Standard (ab 1.6) geändert. Außerdem können wir den Null-Bedingungsoperator von C# 6 verwenden.

using System.Reflection; 
public static object GetPropValue(object src, string propName)
{
    return src.GetType().GetRuntimeProperty(propName)?.GetValue(src);
}

2 Stimmen

Für die Nutzung des ? operator

12voto

Rubens Farias Punkte 55555

Was die Diskussion über verschachtelte Eigenschaften angeht, können Sie den ganzen Reflexionskram vermeiden, wenn Sie die DataBinder.Eval Method (Object, String) wie unten:

var value = DataBinder.Eval(DateTime.Now, "TimeOfDay.Hours");

Natürlich müssen Sie auch einen Verweis auf die System.Web Montage, aber das ist wahrscheinlich keine große Sache.

6voto

Boncho Valkov Punkte 920
public static List<KeyValuePair<string, string>> GetProperties(object item) //where T : class
    {
        var result = new List<KeyValuePair<string, string>>();
        if (item != null)
        {
            var type = item.GetType();
            var properties = type.GetProperties(BindingFlags.Public | BindingFlags.Instance);
            foreach (var pi in properties)
            {
                var selfValue = type.GetProperty(pi.Name).GetValue(item, null);
                if (selfValue != null)
                {
                    result.Add(new KeyValuePair<string, string>(pi.Name, selfValue.ToString()));
                }
                else
                {
                    result.Add(new KeyValuePair<string, string>(pi.Name, null));
                }
            }
        }
        return result;
    }

Dies ist ein Weg, um alle Eigenschaften mit ihren Werten in einer Liste zu erhalten.

0 Stimmen

Warum tun wir das? type.GetProperty(pi.Name) wenn diese == der Variablen pi ?

0 Stimmen

Wenn Sie c# 6.0 verwenden, entfernen Sie die if und tun selfValue?.ToString() Andernfalls beseitigen Sie if und verwenden selfValue==null?null:selfValue.ToString()

0 Stimmen

Auch eine Liste von List<KeyValuePair< ungerade ist, verwenden Sie ein Wörterbuch Dictionary<string, string>

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X