2014-02-12 33 views
0

我有必要創建一個泛型方法來檢索從System.Data.Services.Client.DataServiceContext派生的特定種類,我有一些想法如何處理這個,但到目前爲止我卡在通用協方差的概念,這個概念是否適用於這種情況呢?這是我當前的代碼看起來像:爲多個DataContext創建泛型方法的想法

public abstract class BaseODataProvider<T> where T : DataServiceContext, new() 
{ 
    public IApiSettings ApiSettings { get; set; } 

    public BaseODataProvider(IApiSettings ApiSettings = null) 
    { 
     this.ApiSettings = ApiSettings ?? new DefaultApiSettings(); 
    } 

    public T GetContext() 
    { 
     var context = new T(new Uri(ApiSettings.ODataUrl)); 
     context.IgnoreMissingProperties = true; 
     context.IgnoreResourceNotFoundException = true; 
     var credentials = Convert.ToBase64String(Encoding.ASCII.GetBytes(ApiSettings.LoginName + ":" + ApiSettings.Password)); 
     context.SendingRequest += 
       (object s, SendingRequestEventArgs e) => 
         e.RequestHeaders.Add("Authorization", "Basic " + credentials); 
     return context; 
    } 
} 

正如你所看到的,有沒有辦法,我可以使用可選參數實例T,它說:「cannot provide parameters when creating an instance of a type parameter 'T'」,但是我想找出一種方法來解決所需要的URI來創建一個基於T類型的oDataContext,所以我預計情況會是這樣的:

GetContext<MyContext1>().Table1.Where(x=>x.Id == 1); 
GetContext<MyContext2>().Table2.FirstOrDefault(); 

任何幫助的作品!

+0

您希望我們做什麼?正如你所說的,沒有辦法使用帶有泛型類型參數的構造函數。 – MarcinJuraszek

+0

我想你們建議如果有這個問題的解決方法,不僅對於「new()約束」的限制,有沒有辦法使用Lambda表達式創建T的實例?再次,參數在ctor? –

回答

1

您可以使用反射實例化具有參數的泛型類型的對象。

public T GetContext() 
{ 
    Uri myUri = new Uri(ApiSettings.ODataUrl); 

    Type contextType = typeof(T); 
    DataServiceContext context = (T)Activator.CreateInstance(contextType, myUri); 

    // Do whatever 

    return context; 
} 

Activator.CreateInstance第二個參數是object類型的數組,所以可以在任何數目或參數的構造函數需要類型通過。爲了讓上面的代碼工作,您使用的所有T類型必須具有相同簽名的構造,就像這樣:

public class MyContext1 : DataServiceContext 
{ 
    public MyContext1(Uri uri) 
    { 
     // Do whatever 
    } 
} 

public class MyContext2 : DataServiceContext 
{ 
    public MyContext2(Uri uri) 
    { 
     // Do whatever 
    } 
} 

你不是侷限於單一的參數或者 - 這適用於與構造任何數量的參數。只要確保您爲每個以這種方式實例化的類使用相同數量和類型的參數。