| 

.NET C# Java Javascript Exception

3
Hallo,

ich versuche gerade auf eine als internal gekennzeichnete Klasse und deren internal Members zuzugreifen. Ich denke da werde ich wohl mit Reflection arbeiten müssen. Ich hoffe Ihr könnt mich dabei unterstützen.

Durch einen Dienst (ssrs Subscription) bekomme ich ein notification Object geliefert, das nur ganz wenig Informationen nach drausen liefert. Im Debugger kann man es zum Typ Microsoft.ReportingServices.Library.NotificationImpl casten, so dass man auf die interne Klasse und somit auch auf die internen Members zugreifen kann:

((Microsoft.ReportingServices.Library.NotificationImpl)notification).m_parameters


Die internal Members setzen sich aus unterschiedlichen Typen zusammen (String, ReportImpl, Int32, Setting[] ....)

(leider habe ich keine Möglichkeit einen Screenshot per URL einzubinden, hat jemand einen Tipp?)

Bin ich mir Refelction auf dem richtigen Weg? Und wie komme ich im Code an die "Internal class" und dann an die "internal members" heran?

Danke für Eure Hilfe

Gruß,
16.01.2012
LutzJ 1,3k 6
Ich habe schon mal ein wenig geforscht:

Type type = notification.GetType();
FieldInfo fi = type.GetField("m_parameters");
Object test = fi.GetValue(notification);

Hier bleibt "fi" leider noch null, obwohl by "type" der korrekte Typ angezogen wird....
LutzJ 16.01.2012
2
Wenn Du schon so weit bist: gib GetField als zweiten Parameter BindingFlag.NonPublic (und evtl. weitere Flags) mit, sonst bekommst Du nur public member.
Matthias Hlawatsch 16.01.2012
BindingFlags.Instance war hier entscheidend. Danke für den Tipp. Jetzt komme ich an die Informationen die ich brauche...
LutzJ 16.01.2012
1 Antwort
1
Mit Reflection bist du auf dem richtigen Weg.

So geht der Zugriff auf interene Felder:

List<string> l = new List<string>();

FieldInfo[] _fields =
typeof(List<string>).GetFields(
BindingFlags.NonPublic | BindingFlags.Instance |
BindingFlags.DeclaredOnly);

foreach (FieldInfo fi in _fields)
Console.WriteLine(string.Format("{0}={1}", fi.Name.ToString(), fi.GetValue(l)).ToString());


und so der Zugriff auf einen internen Constructor:

class MyInternalClass{
public int _i = 0;

internal MyInternalClass(int i){
_i = i;
}
}
ConstructorInfo ci = typeof(MyInternalClass).GetConstructor(
BindingFlags.NonPublic | BindingFlags.Instance,
null,
new Type[] { typeof(int) },
null
);
MyInternalClass instance = (MyInternalClass)ci.Invoke(BindingFlags.NonPublic,null,new Object[]{1}, CultureInfo.CurrentCulture);
Console.WriteLine(instance._i);


Wichtig ist in beiden Fällen das "BindingFlags.NonPublic" was den Zugriff auf private und internal Felder, Constructoren, Methoden etc. erlaubt bzw. diese mit listet.

Der Zugriff auf internal und private Klassen ist auch möglich.
16.01.2012
Floyd 11,0k 3 9
Floyd 11,0k 3 9

Stelle deine .net-Frage jetzt!