繁体   English   中英

C#本身附有财产吗?

[英]Is there attached property in C# itself?

在C#本身,WPF中是否有类似“附加属性”的东西?

最简洁的答案是不。 稍微长一点的答案是,这是一个不幸的故事。 我们为C#4设计了“扩展属性”,当我们意识到,哦,等等,我们设计的东西与WPF风格的属性并不真正兼容时,就实现了(但没有测试)它们。 我们最终削减了它,而不是重新设计和重新实现该功能。

更长的版本在这里:

http://blogs.msdn.com/b/ericlippert/archive/2009/10/05/why-no-extension-properties.aspx

AttachedProperties是.NET Framework的一部分,不是C#语言规范的一部分,特别是System.Activities.Presentation.Model命名空间的一部分,它是WPF特定的。

在WPF中,附加属性允许您执行以下操作:

<TextBlock Grid.Row="2" Text="I know nothing about grids!" />

这就像将C#中的类定义为:

public class TextBlock
{
    public string Text { get; set; }
}

能够做到这一点:

var tb = new TextBlock();
tb.Grid.Row = 2; // this line would not compile

为了使这项工作,您需要将Grid对象传递到TextBlock类:

public class TextBlock
{
    public string Text { get; set; }
    public Grid Grid { get; set; }

    public TextBlock(Grid grid)
    {
        Grid = grid;
    }
}

但我认为没有任何东西直接等同于附加属性在WPF中的工作方式。 你需要手工制作它。

你想达到什么目的?

您可以使用ConditionalWeakTable<TKey, TValue>类将任意状态附加到实例。 您可以将它与扩展方法结合使用以创建扩展属性的形式,但遗憾的是没有在C#中使用nice属性语法。

我想你在考虑吸气剂和制定者。

它们是这样创建的:

public class Person
{
    //default constructor 
    public Person()
        {
        }

    private string _Name;
    public string Name
    {
        //set the person name
        set { this._Name = value; }
        //get the person name 
        get { return this._Name; }
    }
}

有关它们如何在这里工作的更多信息: http//msdn.microsoft.com/en-us/library/aa287786(v = vs.71).aspx

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM