Hallo;
nicht leicht das Problem zu zu erklären. Ich versuchs mal:
public interface IExtention
{
PropertyCollection Propertys {get ;}
}
Diese binde ich in der Control ein:
public class content_list : System.Web.UI.UserControl, IExtention
{
PropertyCollection _props = new PropertyCollection(new string[] {"pid", "cid"})
public PropertyCollection Propertys
{
get {return _props;}
}
}
IExtention cntrl = LoadControl("test.ascx";);
cntrl.Propertys.GetByName("pid";).Value ="bla";
Dabei meckert er jedoch rum, dass control nicht in IExtention umgewandelt werden kann. Wie kann ich jedoch die Eigenschaft aufrufen?
Ich hoffe, dass ich mein Problem rüber bringen konnte. Kennt jmd. ein Lösung?
IExtention cntrl = LoadControl("test.ascx") as IExtention;
Wenn ich der Eigenschaft Propertys nun einen Wert zuweise meint er, dass das Objekt nicht instanziert ist. Wie könnte ich der Seite die Control hinzufügen? cntrl ist doch vom Typ IExtention und keine Control.
Ist das überhaupt möglich ein Member einer "unbekannten" Klasse aufzurufen?
hallo,
ich verstehe grad dein problem nicht. "Propertys" hat laut definition deines interfaces keinen "set" modifier. daher kannst du "Propertys" natürlich auch keinen wert zuweisen.
Was meinst du mit "unbekannter klasse" ?
"cntrl" ist gleichermaßen vom Typ Control als auch vom Typ IExtention, da es per "as" von Control gecastet wurde.
Du kannst also einfach soetwas wie Page.Controls.Add(cntrl as Control); sagen.
Mein Fehler. Den Fehler(keine Objektinstanz) hat er nur ausgegeben, weil ich in meiner Extention noch einen Dummy Rückgabewert(null) von Propertys zurückgegeben habe. 😁
ich verstehe grad dein problem nicht. "Propertys" hat laut definition deines interfaces keinen "set" modifier. daher kannst du "Propertys" natürlich auch keinen wert zuweisen
Propertys ist eine Collection von Property Objekten. Ein einzellnes Property Objekt ist beschreibbar.
"cntrl" ist gleichermaßen vom Typ Control als auch vom Typ IExtention, da es per "as" von Control gecastet wurde.
Du kannst also einfach soetwas wie Page.Controls.Add(cntrl as Control); sagen
Dieses gecastete Objekt muss man jedoch noch zu einer Control umwandeln:
Controls.Add( (Control) cntrl);
So funktioniert es. Das mit dem casten kannte ich bissher nicht. Jedoch fallen mir dabei noch weitere Ideen ein 8)
Vielen Dank feadur 😄👍
Was gibt denn die LoadControl - Methode zurück, welchen Typ ? Wenn das was da zurück kommt kein IExtension ist, kannst du es natürlich nicht zu einem casten.
Das der Vorschlag mit dem "as" nicht funktioniert ist daher auch klar. "as" macht nix anderes als zu casten und wenn es nicht funktioniert hat, gibt es null zurück.
Du kannst es ja mal so versuchen um ein paar mehr Infos zu kriegen :
if(typeof(IExtension).IsAssignableFrom(LoadControl("test.ascx").GetType()))
{
//Was zurück kommt ist ein IExtension
}
else
{
//Was zurück kommt ist kein IExtension
}
Falls der else-Fall eintritt hast Du irgendwo einen Logik-Fehler, denn dann lädst Du etwas anderes als das was Du erwartet hast.
"It is not wise to be wise" - Sun Tzu