为多个DataContext创建通用方法的想法

时间:2014-02-12 23:46:30

标签: c# generics wcf-data-services

我需要创建一个通用的方法来检索一个派生自System.Data.Services.Client.DataServiceContext的特定类,我有一些想法如何处理这个但是到目前为止我一直坚持这个概念通用协方差,这个概念是否适用于这种情况?这是我当前代码的样子:

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,它说&#34; cannot provide parameters when creating an instance of a type parameter 'T'&#34;但是我想找到一种方法来解析什么是URI需要根据T的类型创建oDataContext,所以我期望的实例将是这样的:

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

任何帮助都有效!

1 个答案:

答案 0 :(得分: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
    }
}

您不仅限于单个参数 - 这适用于具有任意数量参数的构造函数。只需确保您为每个以这种方式实例化的类使用相同数量和类型的参数。