2011-06-15 31 views
1

我想創建一個通用查找方法,以指定一個對象的類型和一些其他標識參數,該方法返回該類型的對象。這可能嗎?通用查找方法

我在想這樣的事情。

public T GetObjectOfType(Guid ID, typeof(T Class)) 
{ 
    //lookup this object and return it as type safe 
} 

我知道這是行不通的,但我希望它解釋了概念

+0

什麼是GUID? – asawyer 2011-06-15 03:20:47

回答

2

您可以使用此泛型方法:

public T GetObjectOfType<T>(Guid id) where T: class, new() 
{ 
    if (id == FooGuid) //some known identifier 
    { 
     T t= new T(); //create new or look up existing object here 
     //set some other properties based on id? 
     return t; 
    } 
    return null; 
} 

如果你想要的是創建一個實例的特定類型你不需要額外的ID參數,我假設你想設置一些屬性等等基於ID。此外,您的課程必須提供默認構造函數,因此限制爲new()

+0

我不知道這將如何使用。既然你必須在編譯時傳入類型,爲什麼不直接調用new而不是委託給這個方法呢?我可以理解一個工廠方法,該方法返回一個基於參數實現某個接口的類型,但T可以是任何具有默認構造方法的引用類型,那麼有什麼意義呢? – 2011-06-15 03:38:32

+0

@Ed S .:沒有澄清我不太確定我自己(就像我承認它非常沒用) - 可能是緩存層,即查找緩存對象而不是創建新對象,但當然這只是一個推測。 – BrokenGlass 2011-06-15 03:43:47

+0

這是一個依賴注入/控制反轉框架的基礎知識;您請求一個接口的實例,並且返回的具體參數由使用程序集掃描的默認約定或某種類型的註冊表定義。見http://www.hanselman.com/blog/ListOfNETDependencyInjectionContainersIOC.aspx – gazarsgo 2011-06-15 03:50:11

2

工廠方法通常不採用要創建的對象類型。它們返回一個實現了一些通用接口的類型,具體的底層類型依賴於一些參數,通常是一個枚舉值。一個簡單的例子:

interface Whatever 
{ 
    void SomeMethod(); 
} 

class A : Whatever { public void Whatever() { } } 

class B : Whatever { public void Whatever() { } } 

enum WhateverType { TypeA, TypeB } 

public void GetWhatever(WhateverType type) 
{ 
    switch(type) 
    { 
     case WhateverType.TypeA: 
      return new A(); 
      break; 
     case WhateverType.TypeB: 
      return new B(); 
      break; 
     default: 
      Debug.Assert(false); 
    } 
} 

在那裏你有類型安全。我不知道如何在泛型中實現類似的東西,因爲您需要在編譯時提供泛型參數。