2016-10-11 173 views
-3

我正在開發一個類,它創建一個爲類指定的類的實例(使用Activator.CreateInstance)(作爲類型參數或作爲構造函數的參數),所以當類創建一個實例時,創建類的實例是毫無意義的,因此使用泛型傳遞類型是有道理的。例如。在一個類和一個通用類之間共享代碼

var foo = new Foo<Bar>(); 

但是,這使得該類不可能在運行時使用,因爲類型參數是在編譯時聲明的。

要在運行時使用它,構造函數需要將該參數作爲參數。例如。

var foo = new Foo(new Bar()); 

的代碼中的類,其餘都是一樣的,所以如果這是兩個不同的類,然後會有很多重複的代碼。

問題:

  • 如何共享代碼和避免重複的代碼?
  • 可以(而且應該)這是同一類的兩個構造函數嗎?
  • 我採取了錯誤的方法?也許new Foo(typeof(Bar))
+1

請解釋這背後的目的是什麼..目前它還不清楚/太寬..我假設爲「共享代碼」 - 組合/繼承。兩個構造函數 - 是的,可能的。 'typeof(Bar)' - 這是別的 - 取決於你想做什麼 –

+0

我很好奇你的實現是什麼樣的。從這個問題來看,這聽起來更像是繼承的候選人而非泛型。或者如果'Foo'依賴於'Bar',那麼共同的屬性/方法可以調用另一個並避免重複。 – Theo

+4

*我正在開發一個類,該類創建一個爲該類指定的類的實例(作爲類型參數或作爲構造函數的參數),因此在類時創建類的實例是毫無意義的無論如何創建一個實例,因此傳遞類型使用泛型是有道理的。* ...嗯? –

回答

0

好吧,我現在已經想通了!

我做了兩個獨立的類;一個正常的和一個通用的。泛型繼承自普通泛型,並且有一個通用構造函數,可以從基類中調用構造函數。

正常類需要接受Type作爲參數的構造函數(此構造函數不一定是public,它可以是protected)。這個構造函數是從泛型類中調用的。

public class Foo 
    { 
     private readonly object _bar; 

     public Foo(Bar bar) : this(bar.GetType()) 
     { 
     } 

     protected Foo(Type bar) 
     { 
      _bar = Activator.CreateInstance(bar); 
     } 

     public void Write() 
     { 
      Console.WriteLine(_bar); 
     } 
    } 

    public class Foo<T> : Foo 
    { 
     public Foo() : base(typeof(T)) 
     { 
     } 
    } 

現在我可以使用普通類或泛型類實例化我的類。

var foo1 = new Foo(new Bar()); 
    foo1.Write(); 

    var foo2 = new Foo<Bar>(); 
    foo2.Write(); 
+0

爲什麼構造函數Foo(酒吧欄)創建一個新實例?你可以簡單地_bar = bar。 –

+0

@ R.Rusev,因爲這是這個特定類別設計的目的。然而,我編輯了這篇文章以重寫它,以便只有一個構造函數執行該任務,現在它調用另一個構造函數以避免重複代碼。 – Fred

+0

因此,類(Foo)的目的是始終創建指定類(Bar)的新實例,即使通過將該類(Bar)的現有實例提供給類(Foo)的構造函數來完成該操作? –

0

我試圖用自定義構造函數的問題。它不起作用。這是因爲C#將Foo <Bar>和Foo <Int>視爲完全其他類型。所以接收該類型的構造函數不起作用。

下一個解決方案是一個通用的靜態類的介紹,以幫助這一點:

[TestClass] 
public class FooBarTest 
{ 
    [TestMethod] 
    public void TestFooBar() 
    { 
     var foo = new Foo<Bar>(); 
     var foo2 = Foo.CreateFoo(new Bar()); 
     Assert.AreEqual(foo.GetType(), foo2.GetType()); 
    } 
} 


public class Foo<T> 
{ 
    public Foo() 
    { 

    } 

    public Foo(T obj) 
    { 

    } 
} 

public static class Foo 
{ 
    public static Foo<TType> CreateFoo<TType>(TType obj) 
    { 
     return new Foo<TType>(obj); 
    } 
} 

public class Bar 
{ 

} 

這將意味着靜態類Foo(沒有仿製藥)將創建對象爲您服務。單元測試包括檢查效果!

相關問題