gpt4 book ai didi

c# - 关于将嵌套/分层对象的字段映射到平面列表的意见?

转载 作者:行者123 更新时间:2023-12-03 11:01:26 25 4
gpt4 key购买 nike

我正在编写一个工具,该工具可以访问Word文档以将其预填充数据。该文档有一个custom document properties子集,每个子​​集都由一个名称标识,其值用于更新文档中的字段。

我的ViewModel既应该能够从那些文档属性的数据启动/更新其实例,又可以写回其值并更新文档的字段。

像这样:

class PersonVM : INotifyPropertyChanged 
{
// properties
string Name { get; set; }
string PhoneNumber { get; set; }

// methods to get data or save data of this properties to or from the word document
void saveMyPropertyValuesToWord()
{
// …
}

void updateMyPropertiesFromWord()
{
// …
}
}

class ProjectVM : INotifyPropertyChanged
{
int ProjectNumber { get; set; }
PersonVM Manager { get; set; }
PersonVM Mechanic1 { get; set; }
PersonVM Mechanic2 { get; set; }

void saveMyPropertyValuesToWord()
{
Manager.saveMyPropertyValuesToWord();
Mechanic1.saveMyPropertyValuesToWord();
Mechanic2.saveMyPropertyValuesToWord();

// handle ProjectNumber etc.
}

void updateMyPropertiesFromWord()
{
Manager.updateMyPropertiesFromWord();
Mechanic1.updateMyPropertiesFromWord();
Mechanic2.updateMyPropertiesFromWord();

// handle ProjectNumber etc.
}

class CompanyVM : INotifyPropertyChanged
{
string Name { get; set; }
PersonVM Owner { get; set; }
ProjectVM Project1 { get; set; }
ProjectVM Project2 { get; set; }

// …
}

// …
}

现在,我有一个带有静态字符串属性的类,该类的每个文档属性都可能存在于word文档中,我想从中相应地加载数据:

class WordUtils 
{
// Company
static string CompanyName = "dp_CompanyName";
// Company.Owner
static string CompanyOwnerName = "dp_CompanyOwnerName";
static string CompanyOwnerPhone = "dp_CompanyOwnerPhone";
// Company.Project1
static string CompanyProject1Number = "dp_CompanyProject1Number";
// Company.Project1.Manager
static string CompanyProject1ManagerName = "dp_CompanyProject1ManagerName";
static string CompanyProject1ManagerPhone = "dp_CompanyProject1ManagerPhone";
// Company.Project1.Mechanic1

// … etc
}

现在回到实现那些 PersonVM.saveMyPropertyValuesToWord()-我想到了这样的事情:

void saveMyPropertyValuesToWord()
{
Name = MyApp.MyWordDocument.GetCustomProperty(WordUtils.OwnerName);
}

但是在这里我需要在类级别上确切地知道它是从哪个实例调用的(即我是哪个PersonVM,Company.Owner或Project1.Manager或?),以便确定我需要提供的WordUtils.Name。

我不确定该怎么做,也许使PersonVM抽象化并为每个角色创建一个新类(又只有一个实例,在我看来不是很漂亮)吗?我还简要介绍了属性,并希望它们在这种情况下可能会有所帮助。也许我遗漏了一些明显的东西,但是到目前为止,寻求一种可靠的方法来解决这个问题的广泛探索是徒劳的。

最佳答案

这样的事情怎么样:

class Property
{
public string Key { get; }
public string Value { get; set; }
public Property(string key) => Key = key;
}

interface IPropertyTree
{
IEnumerable<IPropertyTree> ChildNodes { get; }
IEnumerable<Property> Properties { get; }
}
class PersonVM : IPropertyTree
{
private readonly string prefix;

public PersonVM(string prefix)
{
Name = new Property(prefix + "Name" );
PhoneNumber = new Property(prefix + "PhoneNumber");
}

public Property Name { get; }
public Property PhoneNumber { get; }
public IEnumerable<IPropertyTree> ChildNodes => Enumerable.Empty<IPropertyTree>();
public IEnumerable<Property> Properties => new[] {Name, PhoneNumber};
}
static class PropertyTreeExtensions
{
public static void Update(this IPropertyTree self)
{
foreach (var property in self.Flatten().SelectMany(tree => tree.Properties))
{
property.Value = MyApp.MyWordDocument.GetCustomProperty(property.Key);
}
}

public static IEnumerable<IPropertyTree> Flatten(this IPropertyTree self)
{
var stack = new Stack<IPropertyTree>();
stack.Push(self);
while (stack.Count > 0)
{
var current = stack.Pop();
yield return current;
foreach (var child in current.ChildNodes)
{
stack.Push(child);
}
}
}
}

这应该允许每个属性具有唯一的键,并使键和属性值紧密耦合。它还应允许您将保存/更新逻辑移动到集中位置。

关于c# - 关于将嵌套/分层对象的字段映射到平面列表的意见?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61680341/

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