gpt4 book ai didi

c# - 在 C# 中解决丢失的 MI

转载 作者:行者123 更新时间:2023-11-30 18:08:19 26 4
gpt4 key购买 nike

我有一些代码可以传递一个派生自某个类的类。我们称它为参数类。
该代码使用反射遍历类的成员并分析提供给他们的某些自定义属性。基本上,它是一个可配置的解析器,它将根据属性分析输入并将它找到的内容放入数据成员中。

这在我们的代码中用在了多处。您指定参数类,放入属性数据成员,并将其传递给解析器。像这样:

public class MyFancyParameters : ParametersBase
{
[SomeAttribute(Name="blah", AnotherParam=true)]
public string Blah { get; set; }

// .. .more such stuff
}

var parameters = new MyFancyParameters();
Parser.Parse(input, parameters);

在许多地方,有类似的属性数据成员组需要解析。所以参数类在某些地方是相似的。那是多余的,当然,这很伤人。每当我需要在这样的区域进行更改时,我需要在六个地方进行更改,所有的克隆。这些部分开始分开只是时间问题。

但是在无环图中不能对相似性进行分组,所以我不能使用单继承来对它们进行分组。
我会在 C++ 中做的是将这些类似的东西 block 放入它们自己的类中,只需继承其中包含我需要的任何东西的一堆,然后完成。 (我认为这被称为混合继承。)
但是,C# 没有多重继承。所以我在考虑将这些 block 放入数据成员中,并将解析器更改为递归到数据成员中。但这会使解析器变得相当复杂。

还有什么?

最佳答案

您能否让您的解析器接受一组参数类而不是单个参数类?或者,您可以允许解析器递归到您的参数类中,并让它提供额外的参数类作为属性。基本上,从类型 ParametersBase 继承的 ParametersBase 派生类的每个属性都递归并展平为单个参数列表。

其实我刚刚看到你已经提到了递归的解决方案。我认为这可能是您最好的选择,而且支持起来也不太复杂。您应该能够创建一个辅助函数来枚举使层次结构看起来像平面类的参数属性。


如果我正确理解您的要求,这里有一些代码可以提供您的属性的“扁平化” View 。您可能希望通过额外的保护措施(例如保留一堆类型来检测循环引用)来扩充生产代码。

public class ParametersParser
{
public static IEnumerable<PropertyInfo> GetAllParameterProperties(Type parameterType)
{
foreach (var property in parameterType.GetProperties())
{
if (Attribute.IsDefined(property, typeof(SomeAttribute)))
yield return property;

if (typeof(ParametersBase).IsAssignableFrom(property.PropertyType))
{
foreach (var subProperty in GetAllParameterProperties(property.PropertyType))
yield return subProperty;
}
}
}
}

关于c# - 在 C# 中解决丢失的 MI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3310323/

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