Supponiamo Ho le seguenti dizionari:operazioni LINQ su IDictionary
private Dictionary<int, string> dic1 = new Dictionary<int, string>()
{
{ 1, "a" },
{ 2, "b" },
{ 3, "c" }
}
private Dictionary<SomeEnum, bool> dic2 = new Dictionary<SomeEnum, bool>()
{
{ SomeEnum.First, true },
{ SomeEnum.Second, false },
{ SomeEnum.Third, false }
}
voglio convertire questi due dizionari in un Dictionary<string, object>
Ad esempio:
dic1 = new Dictionary<string, object>()
{
{ "1", "a" },
{ "2", "b" },
{ "3", "c" }
}
dic2 = new Dictionary<string, object>()
{
{ "First", true },
{ "Second", false },
{ "Third", false }
}
Come si può vedere , la chiave string
di questi dizionari è solo la rappresentazione string
di quelli precedenti.
Il metodo che è responsabile per la conversione ha la seguente firma:
public static object MapToValidType(Type type, object value)
{
//....
if(typeof(IDictionary).IsAssignableFrom(type))
{
//I have to return a Dictionary<string, object> here
return ??;
}
}
Ho provato quanto segue:
((IDictionary)value).Cast<object>().ToDictionary(i => ...);
Ma i
stata fusa a un oggetto, quindi non posso accedere al chiave o valore. Per questo avrei dovuto lanciarlo nell'approciato KeyValuePair<TKey, TValue>
, ma non conosco il tipo TKey
o TValue
.
Un'altra soluzione è quella di fare questo:
IDictionary dic = (IDictionary)value;
IList<string> keys = dic.Keys.Cast<object>().Select(k => Convert.ToString(k)).ToList();
IList<object> values = dic.Values.Cast<object>().ToList();
Dictionary<string, object> newDic = new Dictionary<string, object>();
for(int i = 0; i < keys.Count; i++)
newDic.Add(keys[0], values[0]);
return newDic;
Tuttavia, io non sono un gran fan di questo approccio e non vedo per una sola riga dichiarazione LINQ più semplice e più amichevole.
Dai un'occhiata alla mia risposta è che ciò che è necessario, convertire qualsiasi dizionario generico Dictionary, semplici due operazioni, una riga, il metodo –
BhavO