這是一個老問題,但在這裏不用那並不是一個可行的解決方案不要使用接口。
您可以在內部類設置代表在外部類中,像這樣一個靜態函數:
public class Outer {
private delegate void _operateDlg(Inner inner, bool value);
private static _operateDlg _validate;
static Outer() {
Inner.Init();
}
public void Set(Inner inner, bool value) {
_validate(inner, value);
}
public class Inner {
public bool IsValid {get; private set; }
public static void Init() {
Outer._validate += delegate(Inner i, bool value) {
i.IsValid = value;
};
}
}
}
你可以把各種不同的代表在你與分配外部類Inner.Init()方法,例如通過私有構造函數返回Inner類的實例或通過特定字段的getters/setters返回的方法。
如果你不介意在你的內部類中有一個額外的Init()靜態函數,那麼這並不需要改變。但是,如果你不想在init()方法是可見的,你可以使用反射來稱呼它:
using System.Reflection;
public class Outer {
private delegate void _operateDlg(Inner inner, bool value);
private static _operateDlg _validate;
static Outer() {
typeof(Inner).GetMethod("Init",
BindingFlags.Static | BindingFlags.NonPublic).Invoke(null, null);
}
public void Set(Inner inner, bool value) {
_validate(inner, value);
}
public class Inner {
public bool IsValid {get; private set; }
private static void Init() {
Outer._validate = delegate(Inner i, bool value) {
i.IsValid = value;
};
}
}
}
我知道,一個可以使用反射反正繞過私人訪問限制,但只使用到在我看來,調用一個Init()方法然後分配合適的代表是一種更清潔和更靈活的解決方案。另一種方法是爲每個可能想要創建的委託調用反射,甚至可能會有限制(例如無法爲構造函數創建委託)。
上述解決方案不僅支持包裝構造函數,而且它只會在程序的生命週期中使用Reflection一次,所以除了使用代表實現什麼功能之外,不應該有明顯的性能損失應該首先被允許作爲直接訪問。我不知道爲什麼C#不支持這個,我想不出爲什麼它不支持。
內部關鍵字不夠嗎? – Kimi 2010-05-12 08:13:12
這太多了:-)。 – greenoldman 2010-05-12 11:25:26
你不相信你的同事? – 2010-05-12 14:23:54