Frage

Ist es möglich, in C # eine System.Collections.Generic.Dictionary<TKey, TValue> zu schaffen, wo TKey Unbedingte Klasse und TValue - eine anonyme Klasse mit einer Reihe von Eigenschaften, zum Beispiel - Datenbank Spaltennamen und es lokalisiert Namen

.

So etwas wie folgt aus:

new { ID = 1, Name = new { Column = "Dollar", Localized = "Доллар" } }
War es hilfreich?

Lösung

Sie können nicht erklären, ein solches Wörterbuch direkt eingeben (es gibt kludges aber diese sind für die Unterhaltung und Neuheit Zwecke), aber wenn Sie Ihre Daten aus einem IEnumerable oder IQueryable Quelle kommen, können Sie mit dem LINQ ToDictionary Operator erhalten und Projizieren aus den erforderlichen Schlüssel und (anonym typisiert) Wert aus den Sequenzelemente:

var intToAnon = sourceSequence.ToDictionary(
    e => e.Id,
    e => new { e.Column, e.Localized });

Andere Tipps

Wie itowlson sagte , können Sie nicht erklären ein solches Tier, aber man kann in der Tat erstellen ein:

static IDictionary<TKey, TValue> NewDictionary<TKey, TValue>(TKey key, TValue value)
{
    return new Dictionary<TKey, TValue>();
}

static void Main(string[] args)
{
    var dict = NewDictionary(new {ID = 1}, new { Column = "Dollar", Localized = "Доллар" });
}

Es ist nicht klar, warum Sie eigentlich wollen würde zu Code verwenden.

ich denke, ASP.NET MVC diese Frage zu dem Zeitpunkt nicht beendet hat gemacht wurde. Es konvertiert anonyme Objekte Wörterbücher intern.

Werfen Sie einen Blick auf die HtmlHelper Klasse , zum Beispiel. Die Methode, die Objekte auf Wörterbücher ist die AnonymousObjectToHtmlAttributes . Es es ist specifc zu MVC und gibt eine RouteValueDictionary jedoch.

Wenn Sie etwas allgemeinere wollen, versuchen Sie dies:

public static IDictionary<string,object> AnonymousObjectToDictionary(object obj)
{
    return TypeDescriptor.GetProperties(obj)
        .OfType<PropertyDescriptor>()
        .ToDictionary(
            prop => prop.Name,
            prop => prop.GetValue(obj)
        );
}

Ein wenig Interessantes advatages dieser Implementierung ist, dass es ein leeres Wörterbuch für null Objekte zurückgibt.

Und hier ist eine generische Version:

public static IDictionary<string,T> AnonymousObjectToDictionary<T>(
    object obj, Func<object,T> valueSelect
)
{
    return TypeDescriptor.GetProperties(obj)
        .OfType<PropertyDescriptor>()
        .ToDictionary<PropertyDescriptor,string,T>(
            prop => prop.Name,
            prop => valueSelect(prop.GetValue(obj))
        );
}

Sie können eine Reflexion tun

public static class ObjectExtensions
{
    /// <summary>
    /// Turn anonymous object to dictionary
    /// </summary>
    /// <param name="data"></param>
    /// <returns></returns>
    public static IDictionary<string, object> ToDictionary(this object data)
    {
        var attr = BindingFlags.Public | BindingFlags.Instance;
        var dict = new Dictionary<string, object>();
        foreach (var property in data.GetType().GetProperties(attr))
        {
            if (property.CanRead)
            {
                dict.Add(property.Name, property.GetValue(data, null));
            }
        }
        return dict;
    }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top