gpt4 book ai didi

c# - 我如何将一个类的字段作为某个对象引用,然后使用该对象稍后获取该字段的值?

转载 作者:行者123 更新时间:2023-11-30 23:01:46 25 4
gpt4 key购买 nike

假设我有以下代码

public class FooClass
{
public int A { get; set; } = 0;
public int B { get; set; } = 0;
}

public class BarClass
{
public int X { get; set; } = 0;
public int Y { get; set; } = 0;
}

public class MyClass
{
int z = 0;
public FooClass Foo { get; set; } = new FooClass();
public BarClass Bar { get; set; } = new BarClass();

public static void MyMethod()
{
// List of MyClass objects
var myList = Enumerable.Range(1, 10).Select(_ => new MyClass()).ToList();

// Some flags set elsewhere
bool getFooAValues = true;
bool getBarYValues = true;
bool getClassZValues = true;

// Some statements that collects "field referecnes" of MyClass
var classFieldReferenceList = new List<...>();
if (getFooAValues)
classFieldReferenceList.Add(...);
if (getBarYValues)
classFieldReferenceList.Add(...);
if (getClassZValues)
classFieldReferenceList.Add(...);

// For each field reference
classFieldReferenceList.ForEach(classFieldRef =>
{
// For each class
myList.ForEach(myClassInst =>
{
// "Select"/"Apply" the reference to get the field value
var fieldValue = myClassInt.getTheFieldReferenceValue(classFieldRef);

// Do something with field value...
return fieldValue;
});

// Do something with the list of field values...
});
}
}

在这段代码中,特别是在 MyMethod 中,我创建了一个 MyClass 对象列表。这个类有几个字段,一些是简单的原始类型,一些是其他类的实例。 我如何以我可以传递的某些对象的形式引用或寻址这些字段?

例如,我开始写代码,类似于下面的代码

public static void MyMethod()
{
// List of MyClass objects
var myList = Enumerable.Range(1, 10).Select(_ => new MyClass()).ToList();

// Some flags set elsewhere
bool getFooAValues = true;
bool getBarYValues = true;
bool getClassZValues = true;

if (getFooAValues)
{
var Avalues = myList.Select(myClassInst => myClassInst.Foo.A);
// Do Action X to list of values
}
if (getBarYValues)
{
var Yvalues = myList.Select(myClassInst => myClassInst.Bar.Y);
// Do Action X to list of values
}
if (getClassZValues)
{
var Zvalues = myList.Select(myClassInst => myClassInst.z);
// Do Action X to list of values
}
}

//Do Action X 是我要对每组值执行的几行代码(在绘图上绘制值,标志表示是否显示绘图线)。不过,我真的不想为我可以在 MyClass 中引用/寻址的每个可能字段复制该代码。因此,我想通过某个“对象”引用一个字段,然后将该对象“应用”到 MyClass 的实例,以获取该字段的值(如果有意义的话)。

我觉得这可能类似于定义一个委托(delegate)?虽然委托(delegate)会特定于某些类结构?..或者也许有一些简单的解决方案让我自己找不到。

最佳答案

您可以使用 Func<MyClass,object>代表:

var classFieldReferenceList = new List<Func<MyClass,object>>();
if (...)
classFieldReferenceList.Add(m => m.Foo.A);
if (...)
classFieldReferenceList.Add(m => m.Foo.B);
if (...)
classFieldReferenceList.Add(m => m.Bar.X);
if (...)
classFieldReferenceList.Add(m => m.Bar.Y);

这并不理想,因为 object用作最常见的分母,但对于类型的“混合包”来说是必需的。

在您的第二个示例中,您可以使用通用方法:

private void DoActionsOnSelectedFields<T>(IEnumerable<MyClass> data, Func<MyClass,T> selector) {
foreach (T val in data.Select(selector)) {
... // Perform some common action
}
}

关于c# - 我如何将一个类的字段作为某个对象引用,然后使用该对象稍后获取该字段的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50844553/

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