C# 将方法添加到DapterFactory接口

C# 将方法添加到DapterFactory接口,c#,castle,castle-dictionaryadapter,C#,Castle,Castle Dictionaryadapter,我正在关注网站上的教程,该教程讨论如何使用DictionaryAdapterFactory和一个界面来访问应用程序应用程序。在代码中不使用字符串来设置键 它的工作方式是定义一个界面,其中包含应用程序设置的键名称 public interface ISettings { string dog { get; } string cat { get; } } 然后使用DictionaryAdapterFactory在界面和app.settings字典之间进行编码 va

我正在关注网站上的教程,该教程讨论如何使用DictionaryAdapterFactory和一个界面来访问应用程序应用程序。在代码中不使用字符串来设置键

它的工作方式是定义一个界面,其中包含应用程序设置的键名称

   public interface ISettings
   {
    string dog { get; }
    string cat { get; }
   }
然后使用DictionaryAdapterFactory在界面和app.settings字典之间进行编码

var factory = new DictionaryAdapterFactory();                    
var settings = factory.GetAdapter<ISettings>(ConfigurationManager.AppSettings);
我的问题是,有可能有比简单的getter更复杂的东西吗。例如,我可以告诉DictionaryAdapterFactory对其中一个密钥的值使用解密方法,然后返回该方法而不是密钥值吗


我假设这是不可能的,因为您不能在接口中定义方法,但想看看是否有我缺少的其他方法。

您可以使用包装类将接口包装为实现自定义方法的类

在接口上添加[AppSettingWrapper]:

[AppSettingWrapper]
public interface ISettings
{
string dog { get; }
string cat { get; }
}
AppSettingWrapper类在下面的类中定义,允许您在getter和setting中执行所需的操作

public class AppSettingWrapperAttribute : DictionaryBehaviorAttribute, IDictionaryKeyBuilder, IPropertyDescriptorInitializer, IDictionaryPropertyGetter
{
    public string GetKey(IDictionaryAdapter dictionaryAdapter, string key, PropertyDescriptor property)
    {
        return key;
    }

    public object GetPropertyValue(IDictionaryAdapter dictionaryAdapter, string key, object storedValue, PropertyDescriptor property, bool ifExists)
    {
        return storedValue;
    }

    public void Initialize(PropertyDescriptor propertyDescriptor, object[] behaviors)
    {
        propertyDescriptor.Fetch = true;
    }
}

这个解决方案的大部分来自于

public class AppSettingWrapperAttribute : DictionaryBehaviorAttribute, IDictionaryKeyBuilder, IPropertyDescriptorInitializer, IDictionaryPropertyGetter
{
    public string GetKey(IDictionaryAdapter dictionaryAdapter, string key, PropertyDescriptor property)
    {
        return key;
    }

    public object GetPropertyValue(IDictionaryAdapter dictionaryAdapter, string key, object storedValue, PropertyDescriptor property, bool ifExists)
    {
        return storedValue;
    }

    public void Initialize(PropertyDescriptor propertyDescriptor, object[] behaviors)
    {
        propertyDescriptor.Fetch = true;
    }