gpt4 book ai didi

c# - FastMember ObjectReader 不适用于继承的接口(interface)

转载 作者:行者123 更新时间:2023-11-30 16:45:55 28 4
gpt4 key购买 nike

我从一个我无法控制的库返回一个接口(interface):

public interface IA : IB { String A { get;} }
public interface IB { String B { get;} }

现在,当我尝试运行这段代码时,出现异常:

List<IA> list = library.Get();
IDataReader r = ObjectReader.Create(list, nameof(IA.A), nameof(IA.B));
while (r.Read())
{
for (Int32 i = 0; i < r.FieldCount; i++)
{
//HERE ArgumentOutOfRangeException: Specified argument was out of the range of valid values.Parameter name: name
Object o = r[i];
Console.Write(o + ",");
}
Console.WriteLine();
}

它似乎没有找到 B属性,因为它是在 IB 中声明的。我通过测试并在 IA 中加入 B 来确认这一点直接。

我发现了一个非常糟糕的解决方法,它涉及创建一个实现 IA 的新类:

public class Ab : IA
{
public Ab(String a, String b)
{A = a;B=b;}

public String A { get;}
public String B { get;}
}

然后转换List<IA>因此:List<Ab> newList = l.Select(e => new Ab(e.A, e.B).ToList() , 然后 ObjectReader.Create(newList) . ObjectReader 似乎找到了 B我这样做时的属性(property)。但是创建具有完全相同内容的中间对象似乎非常浪费资源(和大量代码)。

是否可以用另一种不涉及创建新对象的方式解决问题?

最佳答案

我克隆了 FastMember 包的存储库,在 TypeAccessor 类中我将第 265 行从:

PropertyInfo[] props = type.GetProperties(BindingFlags.Public | BindingFlags.Instance);

到:

PropertyInfo[] props = GetPrpsInterfaces(type, BindingFlags.Public | BindingFlags.Instance).ToArray();

替换函数的实现:

static IEnumerable<PropertyInfo> GetPrpsInterfaces(Type type, BindingFlags flags)
{
if (!type.IsInterface)
return type.GetProperties(flags);

return (new Type[] { type }).Concat(type.GetInterfaces()).SelectMany(i => i.GetProperties(flags));
}

我在这里找到: GetProperties() to return all properties for an interface inheritance hierarchy

这对我有用。

关于c# - FastMember ObjectReader 不适用于继承的接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41241131/

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