gpt4 book ai didi

c# - 具有动态编程的 FrameworkElement 和 FrameworkContentElement 的通用接口(interface)

转载 作者:行者123 更新时间:2023-11-30 16:01:22 24 4
gpt4 key购买 nike

我试着简而言之:FrameworkElement 和 FrameworkContentElement 共享许多相同的 API,但没有通用的接口(interface)。只有 DependencyObject 作为基类。

我遇到了 this implementation of IFrameworkElement ,它手动添加一个接口(interface)和两个包装器类。现在这段代码是在 .NET 3.5 中实现的,作者评论说在 .NET 4 中使用动态编程会容易得多:

The actual code is very simple, but about 624 lines long for each element. (It will be a much simpler one line implementation in a dynamic language - C# 4.0 is coming :) ).

我很好奇它的实现会是什么样子。我假设它会归结为 IFrameworkElement 的动态实现,并阅读有关 ExpandoObjectDynamicObject 的内容,看看我是否可以自己实现,但我我有点难过。我想可以编写 DynamicObject 的自定义实现 - 但这不是单行代码。这真的可以通过动态规划变得那么容易吗?我什至不需要成为一个类轮,我可以使用 10 甚至 100 行而不是原来的 1250 行。

我是这样想的:

// Example, not working:
public IFrameworkElement AsFrameworkElement(FrameworkElement ele)
{
dynamic ife = ele as IFrameworkElement;
return ife;
}

IFrameworkElement frameworkElement = AsFrameworkElement(new Button());
frameworkElement.DataContext = "Whatever";

IFrameworkElement frameworkContentElement = AsFrameworkElement(new Paragraph());
frameworkContentElement.DataContext = "Whatever again";

最佳答案

看博客原代码:

var dataContect = "DataContext";
var frameworkElement = sender as FrameworkElement;
if ( frameworkElement != null )
{
frameworkElement.DataContext = dataContect;
}
else
{
var frameworkContentElement = sender as FrameworkContentElement;
if ( frameworkContentElement != null )
{
frameworkContentElement.DataContext = dataContect;
}
}

会变成

var dataContext = "DataContext"
dynamic element = sender;
element.DataContext = dataContext;

已经是这样了。在运行时,将通过反射搜索名称为 DataContext 的属性(注意:当涉及到动态类型列表时,速度可能会非常慢),然后调用它。

注意:如果该属性不存在,将抛出 RuntimeBinderException。您可以在最后一行周围添加一些 try...catch。

关于c# - 具有动态编程的 FrameworkElement 和 FrameworkContentElement 的通用接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38790610/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com