基于某些输入从属性返回不同类型

时间:2015-07-23 07:39:08

标签: c#

我有一个我正在使用的库使用许可证,我想创建一个根据输入返回正确许可证的函数。

这是我正在使用的类的简化版本:

public class Settings {
  private Aspose.Words.License lic;
  private Aspose.Pdf.License plic; // new license

  public License License {
    get {
      if (this.lic == null) {
        this.lic = new License();
        this.lic.SetLicense("Aspose.Total.lic");
      }
      return this.lic;
    }
  }
}

所以你可以看到,有2个License文件,1个在Aspose.Words命名空间,1个在Aspose.Pdf命名空间。

存在更多许可证,但在此示例中我使用的是2

那么如何修改它返回正确许可证的许可证属性。

我的第一个去处是函数中的switch case并插入为字符串,但我不知道你是否可以根据命名空间值进行请求?

2 个答案:

答案 0 :(得分:3)

我检查了Aspose.PDF v 9.6.0,似乎Aspose.Pdf.License是一个独立的类,没有基类,没有接口。

如果你的情况相同,那就没办法了。由于Aspose.Words.License和Aspose.Pdf.License完全不相关,因此无法有条件地将它们从同一属性返回,除非

  • 您将属性的类型从“许可证”更改为“普通对象”
  • 您将所有与许可相关的类重写为generic-over-licensetype

第一种解决方案有一个缺点 - 只要您想使用它,就需要将对象强制转换回正确的许可证类型。非常刺激使用。

第二种解决方案有一些缺点 - 您的代码会变得复杂,您可能需要将许多其他代码段从Settings更改为Settings<X>

public class Settings<TLic> where TLic : class, new(){ 
  private TLic wlic;

  public TLic License {
    get {
      if (this.lic == null) {
        dynamic temp = new TLic();
        temp.SetLicense("Aspose.Total.lic");
        this.lic = temp;
      }
      return this.lic;
    }
  }
}

用法:

var sett1 = new Settings<Aspose.Words.License>();
var wordsLicense1 = sett1.License;

var sett2 = new Settings<Aspose.Pdf.License>();
var pdfLicense2 = sett2.License;

编辑:

OOorr ..你可以将属性重写为像Fabjan建议的方法。这样可以避免更新所有&#34;设置&#34;引用,但会强制您更新所有proeprty引用并使它们成为方法调用..

事后补充:如果您正在处理许多项目中使用的常用代码,并且如果您的每个项目仅使用一种许可类型,那么您实际上可以在不更新重新生成的情况下离开通过使用一些脏的继承技巧:)

public class SettingsBase<TLic> where TLic : class, new(){ 
  private TLic wlic;

  public TLic License {
    get {
      if (this.lic == null) {
        dynamic temp = new TLic();
        temp.SetLicense("Aspose.Total.lic");
        this.lic = temp;
      }
      return this.lic;
    }
  }
}

Project-1中的用法:

// in another file
public class Settings : SettingsBase<Aspose.Words.License> { }

// then
var sett = new Settings();
var wordsLicense = sett.License;

Project-2中的用法:

// in another file
public class Settings : SettingsBase<Aspose.Pdf.License> { }

// then
var sett = new Settings();
var pdfLicense = sett.License;

答案 1 :(得分:2)

首先,我使用using指令使事情更简单:

using WordsLicense = Aspose.Words.License;
using PdfLicence = Aspose.Pdf.License;

然后我们可以创建一个返回实例的泛型方法(使用泛型属性会更方便,但不幸的是它们目前还在开发中):

public class Settings {
   private WordsLicense wlic;
   private PdfLicence plic;

    public static T GetLicense<T>() where T : class
    {
        if (typeof(T) == typeof(WordsLicense)) { if (wlic == null) wlic = new WordsLicense(); return wlic as T; }
        if (typeof(T) == typeof(PdfLicence)) { if (plic == null) plic = new PdfLicence(); return plic as T; }
        return null;
    }   
}