Hallo liebe C# Profis !
Es geht um folgendes Problem : Via Reflection und dem Actiovator lade ich eine Class ! Eine Methode dieser Class hat einen „REF“ Parameter (da sollen Daten zurückkommen)! Allerdings bekomme ich immer eine NullReference Exception !
Folgendes CodeBeispiel einer Console App verdeutlicht das Problem vielleicht :
using System;
using System.Reflection;
namespace MyNs
{
///
/// Summary description for Class1.
///
class MyMain
{
///
/// The main entry point for the application.
///
[STAThread]
static void Main(string[] args)
{
/\* Beispiel : wie kommen mehrere Klassen aus einem anderen Assembly
Assembly fooAssembly = Assembly.LoadFrom("Foo.dll");
Type[] fooTypes = fooAssembly.GetTypes();
\*/
//Type bestimmen, übergeben von Namespace und Class-Name
Type typCls = Type.GetType("MyNs.MyDyn");
// Class instanzieren
object objCls = Activator.CreateInstance(typCls);
//\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
// Erste Methode aufrufen
// Parameter Typen in ParameterTypen Array abspeichern
Type [] paTypesFirst = {typeof(object), typeof(string)};
// Referenz auf eine Methode holen und ParameterTypen mitliefern
// wenn keine Parameter dann "null" übergeben
MethodInfo miFirst = typCls.GetMethod("FirstMeth", paTypesFirst);
// Irgendein Array
string [] strArray = {"Eins", "Zwei", "Drei", "Vier"};
// Irgendein String
string strXXX = "Nur ein String";
// Alle Parameter in ein Array, welches alle Parameter enthält, legen
object [] psFirst = {strArray, strXXX};
// Mit Invoke wird die Methode aufgerufen und die Parameter übergeben
// der Return muß entsprechend des Typs gecastet werden
int intRet = (int) miFirst.Invoke(objCls, psFirst);
Console.WriteLine("Return des ersten Aufrufs : " + intRet.ToString());
//\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
// Zweite Methode aufrufen
Type [] paTypesSec = {typeof(string), typeof(int)};
MethodInfo miSec = typCls.GetMethod("SecMeth", paTypesSec);
string s = "DerString";
int i = 12;
object [] pars = {s,i};
miSec.Invoke(objCls, pars);
//\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
// Dritte Methode aufrufen
Type [] paTypesThrd = {typeof(string), typeof(object)};
MethodInfo miThird = typCls.GetMethod("ThirdMeth", paTypesThrd);
string pWert1 = "MeinStringParam";
object pWert2 = null;
object[] pWerte = {pWert1,pWert2};
// ??????? und hier kommt die Exception ???????????????
int ret = (int) miThird.Invoke(objCls, pWerte);
//ParameterInfo [] piParas = miThird.GetParameters();
}
}
class MyDyn
{
public MyDyn()
{
Console.WriteLine("Constructor called");
}
public int FirstMeth(object pObj, string pStr)
{
Type t = pObj.GetType();
if( t.IsArray)
{
string sOut = "";
object [] os = (object []) pObj;
foreach(object o in os)
sOut += o.ToString() + '\t';
Console.WriteLine("Array : " + sOut);
}
return(33);
}
public void SecMeth(string P1, int P2)
{
Console.WriteLine("P1 {0} / P2 {1} \n",P1, P2);
}
public int ThirdMeth(string Par1, ref object Par2)
{
string [] strArray = new string [] {"Erster", "Zweiter", "Dritter", "Vierter", "Fünfter"};
Console.WriteLine("Par1 : " + Par1);
Par2 = strArray;
return(1);
}
}
}
Für eine Idee, die Lösung oder wo man nachsehen könnte wäre ich sehr dankbar
Ciao
Mario
[MOD]: _Heute bin ich in Spenderlaune und habe den PRE-Tag eingefügt (siehe Brettbeschreibung).
Aber ich würde Euch bitten, Eure Hausaufgaben selbst zu machen. Schließlich wollt Ihr alle, daß die Artikel gelesen und verstanden werden.
Gruß
J._