【问题标题】:Dynamic implementation of an Interface接口的动态实现
【发布时间】:2012-01-17 20:58:03
【问题描述】:

假设我有一个带有一些属性的接口:

public interface IDummy
{
    string First  {get;set;}
    string Second {get;set;}
    string Third  {get;set;}
    string Fourth {get;set;}
}

现在,我有一个实现该接口的类:

public class DummyClass: IDummy
{
    // ...
}

是否可以不显式实现接口属性而使用 DynamicObject?例如:

public class DummyClass: DynamicObject, IDummy
{
    public override bool TryGetMember(GetMemberBinder binder, out object result)
    {
        // Get the value from a Config file or SQLite db or something
    }

    public override bool TrySetMember(SetMemberBinder binder, object value)
    {
        // Get the value to a Config file or SQLite db or something
    }
}

我只是好奇这是否可能? 谢谢。

【问题讨论】:

  • 好吧,你可以试试看它是否有效......

标签: c#


【解决方案1】:

不,这是不可能的。

如果你正在实现一个接口,你需要实现它的所有成员。毕竟,C# 仍然是一种静态类型语言。

当你说一个类型实现了一个接口时,你是在说它符合它的契约。不执行所有成员意味着您不遵守合同。

编译器会看到您的代码,并且不会假设您已正确实现合约(以动态方式) - 它将无法编译。

【讨论】:

    【解决方案2】:

    不,基本上。接口用于静态类型;要满足接口,您的类型实际上必须提供常规(非动态)实现。您可以不声称要实现它(IDummy)并检测名称,但这可能与使用相同名称的任何接口有关,而不仅仅是 IDummy。

    【讨论】:

      【解决方案3】:

      你可以做一个包装器。

      class DummyWrapper : IDummy
      {
          private readonly DynamicObject _wrapped;
      
          public DummyWrapper(DynamicObject wrapped)
          {
              _wrapped = wrapped;
          }
      
          string First
          {
              get { return _wrapped.First; }
              set { _wrapped.First = value; }
          }
      
          string Second
          {
              get { return _wrapped.Second; }
              set { _wrapped.Second = value; }
          }
      
          string Third
          {
              get { return _wrapped.Third; }
              set { _wrapped.Third = value; }
          }
      
          string Fourth
          {
              get { return _wrapped.Fourth; }
              set { _wrapped.Fourth = value; }
          }
      }
      

      您可能还对这些问题感兴趣:

      【讨论】:

        猜你喜欢
        • 2017-08-21
        • 2011-10-18
        • 1970-01-01
        • 2011-02-27
        • 2016-08-31
        • 2016-04-11
        • 2011-04-22
        • 2012-11-01
        • 2017-08-22
        相关资源
        最近更新 更多