【问题标题】:Object initializer with explicit interface in C#在 C# 中具有显式接口的对象初始化器
【发布时间】:2011-02-04 09:50:09
【问题描述】:

如何在 C# 中使用具有显式接口实现的对象初始化器?

public interface IType
{
  string Property1 { get; set; }
}

public class Type1 : IType
{
  string IType.Property1 { get; set; }
}

...

//doesn't work
var v = new Type1 { IType.Property1 = "myString" };

【问题讨论】:

  • 你能告诉我们你为什么要这样做吗?
  • 我建议我的医生建议:“如果疼,不要这样做”。
  • “不要这样做”永远不会激发创新。
  • 问题原因:我有一个明确实现接口的类型,为了简洁起见,我想使用对象初始化器语法对其进行初始化。我发现显式接口实现更不容易出错且更具可读性。

标签: c# explicit-interface


【解决方案1】:

显式接口方法/属性是私有的(这就是为什么它们不能有访问修饰符:它总是private,因此是多余的*)。所以你不能从外部分配给他们。您不妨问:如何从外部代码分配私有属性/字段?

(*虽然他们为什么没有对public static implicit operator做出同样的选择是另一个谜!)

【讨论】:

  • 请将描述扩展为“私人”。其他对象可以调用显式方法,这似乎与您的描述不一致?!
  • 我想我明白显式实现的成员对于实现类型是私有的。 AFAICT 它只是一种语言语法限制,阻止了显式成员的方便设置,这是一种耻辱,因为我更喜欢显式而不是隐式。
  • @Ben Aston - “私人”在所有方面都不是正确的词,例如可以在类内部访问纯私有字段,而显式接口成员甚至不能(直接)允许。更正确的说法是显式接口成员根本无法通过它们实现的类型访问(因此比private更私有!)您只能通过接口类型访问它们本身。对象初始化语法实际上只是分配给成员的一种方式,如果它可以实现普通分配无法实现的事情,那就太奇怪了。
【解决方案2】:

你不能。访问显式实现的唯一方法是通过对接口的强制转换。 ((IType)v).Property1 = "blah";

理论上,您可以在属性周围包裹一个代理,然后在初始化时使用代理属性。 (代理使用对接口的强制转换。)

class Program
{
    static void Main()
    {
        Foo foo = new Foo() { ProxyBar = "Blah" };
    }
}

class Foo : IFoo
{
    string IFoo.Bar { get; set; }

    public string ProxyBar
    {
        set { (this as IFoo).Bar = value; }
    }
}

interface IFoo
{
    string Bar { get; set; }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-11
    • 1970-01-01
    • 2010-12-06
    • 2013-06-27
    • 1970-01-01
    • 2015-12-03
    • 1970-01-01
    相关资源
    最近更新 更多