【问题标题】:Identify the base class from which a property is inherited标识继承属性的基类
【发布时间】:2023-07-11 10:25:01
【问题描述】:

为了使用模式匹配来清理我的代码,我需要找到某个公共属性继承自的公共基类。

在以下示例中,sender 是一个 wpf DataTemplate,由一个 Grid 和几个 UIElement 组成。我想用数据模板的源启动一个拖动事件,一个可以从任何对象的DataContext 属性访问的Vehicle

我需要找到我的UIElements 继承DataContext 属性的公共基类,以便编写干净的代码:

private void Grid_MouseDown(object sender, MouseButtonEventArgs e)
{
   if (e.LeftButton == MouseButtonState.Pressed)
   {
      if (e.Source is CommonBaseClassFromWhichDataContextPropertyIsInherited obj)
      {
         var vehicle = obj.DataContext;
         DataObject data = new DataObject();
         data.SetData(typeof(Vehicle), vehicle);
         DragDrop.DoDragDrop(this, data, DragDropEffects.Move);
      }
   }
}

@thatguy 回答了我的例子:FrameWorkElement 是我正在寻找的类。

但我的问题更多的是关于确定基类的方法:您是否浏览元数据?有智能感知功能吗?

【问题讨论】:

  • 选择DataContext并按F12(转到定义)
  • 好的,谢谢。这个简短的答案在那个人更“完整”的答案中丢失了

标签: c# wpf inheritance pattern-matching


【解决方案1】:

FrameworkElement 类型定义了DataContext 属性,所以你可以匹配它。

if (e.Source is FrameworkElement frameworkElement)
{
   var vehicle = frameworkElement.DataContext;
   // ...
}

确定基类的方法:

  • 使用 IntelliSense 浏览元数据,例如在 XAML 或 C# 代码中单击 DataContext 并点击 F12 或右键单击并选择 Go to definition
  • 谷歌wpf [Name of the property] property,寻找 docs.microsoft.com/... 链接。
  • 记住一个早已被遗忘的培训,其中提到了它,或者在无数博客或其他网站中,您搜索了完全不同的东西并偶然学到了它。
  • Ask a question on *,获取answer(警告,递归)。
  • 通过时间旅行认识未来的自己,但要小心不要打破时空连续体,去过那里,做过那个,很难修复,更难解释。
  • 加入黑暗面并使用无限力量,或者成为绝地并冥想。

【讨论】:

  • 谢谢,但实际上我的问题更多的是关于方法。你是如何确定答案的?你碰巧知道吗?你浏览过元数据吗?是否有智能感知功能?我将编辑我的问题以更好地解释这一点。
  • @geriwald 添加了一些方法来确定基类。
  • 我想要最后的替代解决方案。你能教我吗?
  • 我刚刚找到了最简单的方法:在 DataContext 上按 F12 ......我真的很笨,我是 F12 类,我从来没有想过 F12 属性。这让我找到了 FrameworkElement 的元数据。
  • 啊啊啊啊啊啊啊啊。我陷入了无限循环。这会导致......不,不能在这里开玩笑。