| 

.NET C# Java Javascript Exception

2
Eine Methode des Framework gibt result vom Typ object zurück. Ich weiß aber, dass sich dahinter ein Dictionary<string, object> verbirgt. Jetzt würde ich gern eine Klasse Item einführen:
class Item : Dictionary<string, object> { }

Damit ich das, was zurückkommt, gleich vernünftig typisiere. Aber die Umwandlung von object in Item klappt nicht.
Item item = (Item)result;

Was mach ich falsch?
07.02.2011
Quintus 33 4
4 Antworten
2
Das kann nicht funktionieren, da Deine Item Klasse von Dictionary<string, object> erbt und daher kein direkter Cast durchführbar ist.

Eine Möglichkeit ist, dass Du Deine Item Klasse ein wenig erweiterst und sie wie im Beispiel instanziierst. Dabei arbeitest Du aber logischerweise nicht mit der Originalliste (Fügst Du Deiner Item Klasse einen Eintrag hinzu, bleibte das ürsprüngliche Dictionary Objekt davon unberührt).

Beispiel Item Klasse:
class Program
{
static void Main(string[] args)
{
Item item = new Item(GetResult() as IDictionary<string, object>);
}

public static object GetResult()
{
Dictionary<string, object> result = new Dictionary<string, object>();
result.Add("Item1", 1);
result.Add("Item2", "nix");
return result;
}

class Item : Dictionary<string, object>
{
/* Construction, Initialization */
#region Item(IEnumerable<KeyValuePair<string, object>> items)
public Item(IEnumerable<KeyValuePair<string, object>> items)
{
this.AddRange(items);
}
#endregion

/* Public Methods */
#region AddRange(KeyValuePair<string,object>> items)
public void AddRange(IEnumerable<KeyValuePair<string, object>> items)
{
foreach (KeyValuePair<string, object> item in items)
{
this.Add(item.Key, item.Value);
}
}
#endregion
}
}

Edit Floyd: * Quellcodeformatierung hinzugefügt
07.02.2011
donMarco 21 1
Floyd 14,6k 3 9
0
Du musst einfach den Type prüfen:

Web-Beispiel:

public partial class WebForm2 : System.Web.UI.Page
{
object o = null;
protected void Page_Load(object sender, EventArgs e)
{
Dictionary<string, object> dic = new Dictionary<string, object>();
dic.Add("Test", 1);
o = dic;
if (o is Dictionary<string, object>)
{
((Dictionary<string, object>)o).Add("Test o", 2);
}
foreach (var item in dic)
{
Response.Write(string.Format("Key: {0} - Value: {1}<br />", item.Key, item.Value));
}
foreach (var item in (Dictionary<string, object>)o)
{
Response.Write(string.Format("Key: {0} - Value: {1}<br />", item.Key, item.Value));
}
}
}


Entscheidend ist für dich also die Prüfung vorab, ob der Cast möglich wird.

if (result is Dictionary<string, object>)
{
// dann mach weiter mit deinem Cast auf Dictionary<string, object>
}


Auf Item wirst nie casten können.
07.02.2011
Rene Drescher-Hackel 1,1k 1 8
Ja, genau, das funktioniert. Was aber nicht funktioniert, ist, wenn ich eine Klasse
class Item : Dictionary<string, object> {}
einführe und das Object in diese umwandeln will. Dann gibt es TypeCastException. Aber warum? Das ist doch dasselbe.
Quintus 07.02.2011
nein, das ist es ja eben nicht
Rene Drescher-Hackel 07.02.2011
0
Nein, ist es nicht. Mal ein einfaches Beispiel:

public class Tier
{
}


public class Katze : Tier
{
public float Gewicht {get; set;}
}


wenn Du jetzt eine Instanz {Tier} hast, wie willst Du daraus eine Katze "machen" :-)
Umgekehrt geht es, da eine Katze immer auch ein Tier ist. Schau Dir am Besten mal die Grundlagen der Vererbung an...
07.02.2011
donMarco 21 1
Ja, so erklärt, ist das logisch und macht Sinn. Danke. Andererseits will ich ja eigentlich nur eine Art Alias für Dictionary<string, object> einsetzen. Doof, dass nicht so einfach geht.
Quintus 07.02.2011
0
Die einfachste Lösung sieht so aus (ganz vereinfachtes Beispiel von donMarco's genereller verwendbarer Methode)

class Item : Dictionary<string, object>
{
private Item() { }

public Item(Dictionary<string, object> dict)
{
foreach (KeyValuePair<string, object> kvp in dict)
{
base.Add(kvp);
}
}
}

wobei du dann dein item mittels

Item item = new Item(result);

erzeugst. Ist die am wenigsten flexible Lösung, aber vielleicht ist das Grundprinzip dadurch besser zu verstehen.
07.02.2011
Maria Simlinger 1,1k 1 9

Stelle deine .net-Frage jetzt!
TOP TECHNOLOGIES CONSULTING GmbH