gpt4 book ai didi

c# - 尝试将通用的 MyObj 放入 IList 中,其中对象之间的 U 可能不同

转载 作者:太空宇宙 更新时间:2023-11-03 22:01:31 25 4
gpt4 key购买 nike

我有以下类定义:

public interface IItem{}

public class FirstObject<T, U> : IItem
{
private readonly Expression<Func<T, U> _field;

public FirstObject(Expression<Func<T, U> field, U value)
{
_field = field;
Value = value;
}

public string FieldName
{
get
{
var member = _field.Body as MemberExpression;
if(member != null)
return member.Member.Name;

throw new Exception("exception message");
}
}

public U FieldValue { get; private set; }
}

IList<IItem> myList = new List<IItem>();

IItem 接口(interface)是唯一能够将不同类型的“FirstObject”放入列表的标记。

现在我需要迭代列表并取回我的项目。我绝对需要知道 FieldName 和 FieldValue 及其特定类型。出于这个原因和其他一些原因,我绝对需要能够恢复对象的原始类型。

感谢您的帮助。

更新:我认为我需要做什么有些困惑,所以我更新了代码并改进了解释。

感谢大家的帮助。

最佳答案

如果你想取回 U来自 List<IItem>那么你有几个选择

  1. 嵌入 U进入IItem或一个新界面,并将其设为 List<IItem<U>>相反
  2. 知道 T 的集合和 U您关心并尝试回退的IItem每个组合的实例
  3. 使用dynamic或反射获取值(value)

dynamic解决方案是最直接的,但具有宽松类型的所有缺点

var values = new List<object>();
foreach (dynamic item it myList) {
try {
values.Add(item.SomeProperty);
} catch {
// Ignore missing SomeProperty values
}
}

我更喜欢解决方案 #2。引入一个新接口(interface)并将其存储在 List<T> 中相反。

interface IItem<U> {
U SomeProperty { get; }
}

public class FirstObject<T, U> : IItem, IItem<U> {
...
}

List<IItem<U>> myList = ...

关于c# - 尝试将通用的 MyObj<T, U> 放入 IList 中,其中对象之间的 U 可能不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9917040/

25 4 0