gpt4 book ai didi

c# - 从 C# 中的通用对象获取属性

转载 作者:行者123 更新时间:2023-11-30 13:20:48 25 4
gpt4 key购买 nike

请看一下这段代码:

public void BindElements<T>(IEnumerable<T> dataObjects)
{
Paragraph para = new Paragraph();

foreach (T item in dataObjects)
{
InlineUIContainer uiContainer =
this.CreateElementContainer(item.FirstName ????? )
para.Inlines.Add(uiContainer);
}

FlowDocument flowDoc = new FlowDocument(para);
this.Document = flowDoc;
}

在 Visual Studio“item.XXX”中写入时,我应该从我的实体中获取属性,如 .FirstName 或 .LastName。我不知道 dataObjects 是 IEnumerable 还是 IOrder 等......它必须是通用的!

我怎样才能得到真正的属性表单项?只有反射?

最佳答案

Oded is right ,似乎(对他或我)尝试使此方法通用化没有任何意义。您正在尝试泛化一个方法,该方法的功能实际上特定于几种类型。

现在,也就是说,函数的批量 似乎独立于您要访问的这个属性。那么为什么不把它分成两部分:可以通用化的部分和不能通用化的部分:

像这样:

void BindElements<T, TProperty>(IEnumerable<T> dataObjects,
Func<T, TProperty> selector)
{
Paragraph para = new Paragraph();

foreach (T item in dataObjects)
{
// Notice: by delegating the only type-specific aspect of this method
// (the property) to (fittingly enough) a delegate, we are able to
// package MOST of the code in a reusable form.
var property = selector(item);

InlineUIContainer uiContainer = this.CreateElementContainer(property)
para.Inlines.Add(uiContainer);
}

FlowDocument flowDoc = new FlowDocument(para);
this.Document = flowDoc;
}

然后你处理特定类型的重载,例如 IPerson,可以重用这段代码(我怀疑这可能就是你一直以来的样子——代码重用):

public void BindPeople(IEnumerable<IPerson> people)
{
BindElements(people, p => p.FirstName);
}

...然后对于 IOrder:

public void BindOrders(IEnumerable<IOrder> orders)
{
BindElements(orders, o => p.OrderNumber);
}

...等等。

关于c# - 从 C# 中的通用对象获取属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4292740/

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