扩展一个类及其属性之一

本文关键字:属性 一个 扩展 | 更新日期: 2023-09-27 17:59:50

我一次又一次地遇到这个类设计问题,我意识到我一定做错了什么。其思想是类B:A。这些类使用配置对象和BConfig:AConfig。问题是,我无法想出一个好的方法来访问BConfig中的属性。

这是一个问题的简化示例。

public class Request{
  public virtual RequestConfiguration Config{
   get
   {
     if(Config == null)
       Config= ConfigurationManager.GetSection("RequestConfig")
              as RequestConfiguration;
     return Config;
   }
  }
  public virtual string DoSomething(){
    return "Url:" + Config.Url;
  }
}
public class AuthRequest : Request
{
   public override RequestConfiguration Config
   get
   {
     if(Config == null)
       Config= ConfigurationManager.GetSection("RequestConfig")
              as AuthRequestConfiguration;
     return Config;
   }
  }
  public override string DoSomething(){
    return String.Format("Url:{0} U:{1} P:{2}",Config.Url,Config.User,Config.Pass);
  }
}
/*---- Configuration Classes ----*/
public class RequestConfiguration : ConfigurationSection
{
    [ConfigurationProperty("RequestHost", IsRequired = true)]
    public string RequestHost
    {
        get { return (string)base["RequestHost"]; }
    }
}    
public class AuthRequestConfiguration : RequestConfiguration
{
    [ConfigurationProperty("User", IsRequired = true)]
    public string User
    {
        get { return (string)base["User"]; }
    }
    [ConfigurationProperty("Pass", IsRequired = true)]
    public string Pass
    {
        get { return (string)base["Pass"]; }
    }
}

显然,这段代码无法编译为了实现同样的原理,对这个代码有什么小的修改吗还是我需要采取完全不同的方法?

目标是我可以使用在配置文件中设置的简单依赖项注入来确定要发出的请求类型。

扩展一个类及其属性之一

如何使Request通用;Request<TConfig> where TConfig : RequestConfiguration:

public class Request<TConfig> where TConfig : RequestConfiguration
{
    private TConfig _config;
    public virtual TConfig Config
    {
        get { return _config ?? (_config = ConfigurationManager.GetSection("RequestConfig") as TConfig); }
    }
    public virtual string DoSomething()
    {
        return "Url:" + Config.Url;
    }
}
public class AuthRequest : Request<AuthRequestConfiguration>
{
    public override string DoSomething()
    {
        return String.Format("Url:{0} U:{1} P:{2}", Config.Url, Config.User, Config.Pass);
    }
}
public class RequestConfiguration : ConfigurationSection
{
    [ConfigurationProperty("Url", IsRequired = true)]
    public string Url
    {
        get { return (string) this["Url"]; }
    }
}
public class AuthRequestConfiguration : RequestConfiguration
{
    [ConfigurationProperty("User", IsRequired = true)]
    public string User
    {
        get { return (string) this["User"]; }
    }
    [ConfigurationProperty("Pass", IsRequired = true)]
    public string Pass
    {
        get { return (string) this["Pass"]; }
    }
}

这能解决你的问题吗?至少代码构建:)

这取决于如何在RequestConfiguration和AuthRequestConfiguration上声明属性。

例如,如果您在RequestConfiguration类中将Url属性声明为虚拟,并在AuthRequestConfiguration类中将其声明为重写,那么它应该符合您的预期。

MSDN的详细示例如下http://msdn.microsoft.com/en-us/library/9fkccyh4(v=vs.80).aspx