Auf der einfachsten Ebene legen Sie es auf die gleiche Weise stellen Sie die int
Eigenschaft:
diese Klasse Angenommen:
public class MyClass
{
internal Action<object> Simple { get; set; }
}
die Eigenschaft Rahmen:
var type = typeof(MyClass);
var action = new Action<object>((o) => Console.WriteLine("Invoked with {0}", o));
var obj = new MyClass();
type.GetProperty("Simple", BindingFlags.NonPublic | BindingFlags.Instance).SetValue(obj, action);
Wenn der Delegat enthält Ein Typ, der als Argument nicht öffentlich ist, kann je nach Kovarianz/Kontravarianz trotzdem mithilfe eines Objekts festgelegt werden.
die Klasse Unter der Annahme, wie unten, die Immobilie mit Action<object>
Einstellung funktioniert immer noch
public class MyClass
{
internal Action<Arg> Simple { get; set; }
}
internal class Arg { }
Wenn der Delegattyp selbst intern Sie müssen eine Instanz dieser internen Delegattyp erstellen:
Unter der Annahme:
public class MyClass
{
internal Internal Simple { get; set; }
}
internal class Arg { }
internal delegate void Internal(Arg arg);
können Sie verwenden:
var type = typeof(MyClass);
var prop = type.GetProperty("Simple", BindingFlags.NonPublic | BindingFlags.Instance);
var action = new Action<object>((o) => Console.WriteLine("Invoked with {0}", o));
var delegateInsrtance = Delegate.CreateDelegate(prop.PropertyType, action.Target, action.Method);
var obj = new MyClass();
prop.SetValue(obj, delegateInsrtance);
Hinweis: Der obige Code funktioniert, weil wir erstellt einen Delegaten (Action<object>
), die mit den Internal
Delegierten kompatibel sein können (die Argumente kein explizites Casting benötigen) und verwendet, um die METHOD dieser Delegierten neu erstellen aus interner Delegierter. Abhängig vom Typ des zu erstellenden Delegierten mag dies kniffliger sein, aber ohne weitere Informationen sollte dieses Beispiel ein guter Ausgangspunkt sein.
Möchten Sie ein * Ereignis * setzen/hinzufügen? Z.B. 'Button.Klicken'? –