ich habe ein kleines testprogramm gecoded, um das problem zu veranschaulichen:
[b]CastTest.cs[/b]
namespace CastTest
{
public class BaseClass
{
private int x;
public BaseClass()
{
x = 0;
}
public int X
{
set { x = value; }
get { return x; }
}
}
public interface ITest
{
int Square();
}
public class TestClass : BaseClass, ITest
{
public TestClass()
{
X = 5;
}
public int Square()
{
return X*X;
}
}
}
(1) testen wir das ganze mit einer normalen objektinstanz
[b]Test.cs[/b]
namespace CastTest
{
public class MainClass
{
public static void Main(string[] args)
{
try
{
object instance = new CastTest.TestClass();
int x = ((CastTest.TestClass)instance).Square();
int y = ((CastTest.ITest)instance).Square();
System.Console.Write("x ok: " + x);
System.Console.Write("\ny ok: " + y);
}
catch (System.Exception e)
{
System.Console.Write(e.Message);
}
}
}
}
wer ka IDE verwenden will: "csc Test.cs CastTest.cs"
das ganze compiliert und läuft wunderbar
(2) jetzt das ganze mit dymischer instanzierung der klasse aus der assembly heraus
[b]Test2.cs[/b]
namespace CastTest
{
public class MainClass
{
public static void Main(string[] args)
{
try
{
System.Reflection.Assembly as = System.Reflection.Assembly.LoadFrom("CastTest.dll");
System.Console.Write("Assembly loaded: " + as.ToString());
object instance = as.CreateInstance("CastTest.TestClass");
System.Console.Write("Instance created: " + instance.ToString());
int x = ((CastTest.ITest)instance).Square();
int y = ((CastTest.TestClass)instance).Square();
System.Console.Write(x);
}
catch (System.Exception e)
{
System.Console.Write("\n" + e.Message);
}
}
}
}
zuerst müssen wir CastTest.cs zu einer dll compilieren:
csc /target:library /out:CastTest.dll CastTest.cs
dann Test2.cs. den verweis auf CastTest.cs brauchen wir nur für das interface (und zu testzwecken auch für die klasse selbst. ist schlecht gmacht, weil alles im selben file)
csc Test2.cs CastTest.cs
und siehe da, die assembly wird geladen, die klasse instanziert, aber beim cast gibts eine exception
jetzt schauts euch mal die ausgaben an:
assembly ist CastTest, und das objekt ist vom typ CastTest.TestClass !
also sollte es problemlos zu casten sein
fehlanzeige
tauschts testweise mal die anweisungen mit x= und y=
damit ihr sehts, dass auch der cast auf TestClass fehlschlägt
also... WTF ?
was soll des?
es dürfte ja kein problem mit irgendwelchen assembly-informationen geben, da das objekt ja problemlos instanziert wird, ja sogar vom richtigen typ ist
ps: um das ganze zu übergehn könnt ich zwar über die methoden GetType(), GetMethod() bzw GetProperty() etc. gehen, um meine interface-methoden zur laufzeit zu "suchen" und dann zu invoken, was allerdings sehr unschön wäre