是否有可能檢查某個類型是否具有無參數構造函數,以便投射它並調用一個需要帶有無參數構造函數的方法並使用: new()
約束?如何將對象轉換爲具有公共無參數構造函數以尊重:new()約束?
只能檢查作爲公共無參數的類型,因爲回答here是不夠的,因爲它不允許調用目標方法。
的目標是讓下面的邏輯,其中IInteresting
對象不實現一個公共的無參數的構造函數,需要調用Save1
之前轉換:
public interface IInteresting { }
public void Save<T>(T o) {
var oc = o as (new()); /* Pseudo implementation */
if (oc != null) {
this.Save1(oc);
}
else {
var oi = o as IInteresting;
if (oi != null) {
this.Save2(oi);
}
}
}
private void Save1<T>(T o) where T : new() {
//Stuff
}
private void Save2<T>(IInteresting o) {
//Stuff to convert o to a DTO object with a public parameterless constructor, then call Save1(T o)
}
當然,如果我能Save1
和Save2
份額相同的簽名,將解決問題,但我無法找到一種方式來做到這一點,因爲以下將無法編譯(在Routine
,Save
將調用第一次實現,而不是第二次):
public void Routine<T>(T o) {
var oi = o as IInteresting;
if (oi != null) {
this.Save(oi);
}
}
private void Save<T>(T o) where T : new() {
//Stuff
}
private void Save<T>(IInteresting o) {
//Stuff to convert o to a DTO object with a public parameterless constructor, then call Save(T o)
}
「僅僅是不夠的,因爲它不允許調用目標方法。」 - 實際上,它會的。 ['ConstructorInfo'](http://msdn.microsoft.com/en-us/library/system.reflection.constructorinfo.aspx)包含['Invoke'方法](http://msdn.microsoft.com/zh-cn/ -us /庫/ 6ycw1y17.aspx)。 –
只需使用反射?但首先,重新考慮你的設計。 –
你的Save1方法裏面有什麼? –
sh1ng