扩展法的问题

本文关键字:问题 扩展 | 更新日期: 2023-09-27 18:06:34

我声明了以下扩展方法:

public static T FindAncestor<T>(DependencyObject obj) where T : DependencyObject
{
    while (obj != null)
    {
        T o = obj as T;
        if (o != null)
        {
            return o;
        }
        obj = VisualTreeHelper.GetParent(obj);
    }
    return null;
}
[System.Runtime.CompilerServices.Extension()]
public static T FindAncestor<T>(UIElement obj) where T : UIElement
{
    return FindAncestor<T>((DependencyObject)obj);
}

它似乎不适用于TextBlock:

var csiPage = (sender as TextBlock).FindAncestor<NotebookPageView>();

NotebookPageView继承自UserControl

为什么扩展方法不可用?

扩展法的问题

这不是一个扩展方法。它只是一个静态方法。要使它成为一个扩展方法,您需要在参数上使用this关键字:

public static T FindAncestor<T>(this DependencyObject obj)

另外,正如@Jonathan下面提醒的,扩展方法需要在静态类中,所以要确保在你的代码中是这样的。

有关更多信息,请参阅MSDN关于扩展方法的文档