接口的动态实现

本文关键字:实现 动态 接口 | 更新日期: 2023-09-27 18:17:25

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

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#仍然是一种静态类型语言。

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

编译器会看到你的代码,并且不会假设你已经正确地实现了合约(以一种动态的方式)——它会编译失败。

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

你可以做一个包装器

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

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

  • 自动创建包装器来实现接口
  • 在。net 4.0 (c#)中动态实现一个接口