Hallo,
ich möchte in dem genannten ScriptHost auf Unterklassen zugreifen bekomme aber immer die Meldung dass, das Objekt null oder kein Objekt ist. Wenn ich direkt auf Properties des Hauptobjektes zugreife geht alles wunderbar. Nur bei den Unterobjekten bekomme ich es nicht hin. Ich denke aber der Code stellt es besser dar als meine Beschreibung... 😃
MSScriptControl.ScriptControlClass js = new MSScriptControl.ScriptControlClass();
js.AllowUI = false;
js.Language = "JScript";
js.Reset();
js.AddObject("MyObject", myObject, false);
class AAA
{
public BBB Bbb { get; set; }
}
class BBB
{
public CCC Ccc { get; set; }
}
class CCC
{
public string MyString { get; set; }
}
Und das würde ich gerne machen:
var x = MyObject.Bbb.Ccc.MyString;
Hallo masterchris_99,
dann musst du die Objekte, die enthalten sein sollen, aber noch erzeugen und der Property zuweisen, z.B. im Konstruktor. Das fällt allerdings unter [Hinweis] Wie poste ich richtig? Punkt 1.1.1.
herbivore
Die Unterklassen sind natürlich auch erzeugt und mein obiger Code stellt nur ein Beispiel dar da ich meinen eigentlichen Problemquellcode hier nicht zeigen kann/möchte.
Zumal mein Beispielcode auch korrekt sein kann denn ich übergebe das Objekt ja nur an den Scripthost. Wie das Objekt erzeugt wird sieht man hier ja gar nicht.
Aber der vollständigkeitshalber mal kurz zusammgeschrieben:
AAA myObject = new AAA();
myObject.Bbb = new BBB();
myObject.Bbb.Ccc = new CCC();
Hallo masterchris_99,
es bleibt aber dabei. Die Unterobjekte müssen erzeugt sein.
Zuerst musst du mal herausfinden, bei welchem Objekt das nicht der Fall ist, siehe FAQ-Link. Und als nächstes musst du das Objekt erzeugen (lassen) oder verhindern, dass darauf zugegriffen wird. Steht auch alles in der FAQ.
herbivore
So da es hier zu einigen Unstimmigkeiten kam.
Alle Objekte sind korrekt erzeugt und aus dem normalen Code komplett erreichbar! Das Problem tritt nur im Zusammengang mit dem Scripting-Host auf.
Ich habe schnell mal ein Beispielprojekt erzeugt um alles zu testen.
MSScriptControl.ScriptControlClass js = new MSScriptControl.ScriptControlClass();
AAA myObject = new AAA();
myObject.Bbb = new BBB();
myObject.Bbb.Ccc = new CCC();
myObject.Bbb.Ccc.MyString = "BlaBliBlub";
js.AllowUI = false;
js.Language = "JScript";
js.Reset();
js.AddObject("MyObject", myObject, false);
js.AddCode(richTextBox1.Text);
object[] parms = new object[] { 13 };
//int result = (int)js.Run("test", ref parms);
//bool result2 = (bool)js.Run("test2", ref parms);
//string result3 = (string)js.Run("test3", ref parms);
bool objectIsNull = (myObject.Bbb.Ccc == null);
MessageBox.Show((objectIsNull) ? "Objekt ist Null" : "Objekt ist nicht Null");
MessageBox.Show(myObject.Bbb.Ccc.MyString);
try
{
string result = (string)js.Run("Result", ref parms);
richTextBox2.Text = result;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
[ComVisible(true)]
public class AAA
{
public BBB Bbb { get; set; }
}
public class BBB
{
public CCC Ccc { get; set; }
}
public class CCC
{
public string MyString { get; set; }
}
Dieser Teil zeigt mir auch dass das Objekt nicht NULL ist und erreichbar:
bool objectIsNull = (myObject.Bbb.Ccc == null);
MessageBox.Show((objectIsNull) ? "Objekt ist Null" : "Objekt ist nicht Null");
MessageBox.Show(myObject.Bbb.Ccc.MyString);
[ComVisible(true)] vererbt sich nicht automatisch wie von mir angenommen auf die Unterobjekte sondern muss für jede Klasse explizit hinzugefügt werden.
[ComVisible(true)]
public class AAA
{
public BBB Bbb { get; set; }
}
[ComVisible(true)]
public class BBB
{
public CCC Ccc { get; set; }
}
[ComVisible(true)]
public class CCC
{
public string MyString { get; set; }
}