动态实现接口

时间:2011-12-11 14:16:41

标签: c#

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

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
    }
}

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

3 个答案:

答案 0 :(得分:4)

不,这是不可能的。

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

当你说一个类型实现一个接口时,你说它符合它的合同。未实施所有成员意味着您遵守合同。

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

你可以做一个包装。

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; }
    }
}

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