C#-是否可以声明一个类,其中所有字段都是另一个类的包装器';s场?
请随意修改标题,我想不出更好的了=\ 给定以下示例类C#-是否可以声明一个类,其中所有字段都是另一个类的包装器';s场?,c#,.net,class,oop,C#,.net,Class,Oop,请随意修改标题,我想不出更好的了=\ 给定以下示例类 public class Person { public string Name; public int ID; public string City; } 我需要创建另一个镜像类,其中每个字段实际上都是原始类的包装器: public class PersonMirror { public FieldWrapper<string> Name; public FieldWrapper<
public class Person
{
public string Name;
public int ID;
public string City;
}
我需要创建另一个镜像类,其中每个字段实际上都是原始类的包装器:
public class PersonMirror
{
public FieldWrapper<string> Name;
public FieldWrapper<int> ID;
public FieldWrapper<string> City;
}
public class FieldWrapper<T>
{
public T Value;
public bool someBool;
public int someCounter;
// ..whatever
}
公共类PersonMirror
{
公共字段名称;
公共字段包装器ID;
公共城市;
}
公共类字段包装器
{
公共价值观;
公共布尔-萨默布尔;
公共柜台;
//不管怎样
}
问题是,我有很多类要镜像,其中一些有很多字段!此外,原始类可能会不时更改(添加/删除/重命名字段),并且每次更改都必须应用于镜像类-这不是维护性的好做法
我的问题是-是否有一种类型安全的方法可以自动执行此类镜像类的删除(而不是创建,例如生成的代码)
编辑:
让我们从头开始。在我们的SOA系统中,有一个资源访问服务(serviceX)负责更新数据库中的项。其他服务向它发送它们想要执行的修改——json格式,类似于:
{ID:123,name:“myNewName”}
。然后,serviceX将构建一个更新查询以发送到DB。但是,要求serviceX公开POCO接口,以便该接口与语言无关,因此不允许使用诸如(p=>p.name,“MyNewName”)
之类的表达式。另一个要求是类型安全,因此也不允许使用json。目前,上述解决方案是我们为满足所有需求而提出的最佳解决方案。欢迎有更好的解决方案 IMO,除了代码生成之外,没有其他方法可以做你想做的事情。代码生成的方法可能不同(这可能是源代码生成+编译,发出IL代码,无论是您自己的还是现有的),但这是唯一的方法。您必须在每次代码更改后运行它,但您可以创建代码解析应用程序 列出需要替换的关键字,如“字符串”、“int”。逐行读取文件。查找类的定义(行包含“类”),然后将其中任何给定关键字的每个实例替换为:
"FieldWrapper<" + keyword + ">"
“字段包装器”
您可能希望通过检查“(“and”)”和开头的大括号,在的方法内部(可能在方法签名/返回类型本身中)删除关键字替换。到达右大括号后继续操作。您可以通过将嵌套级别存储在整数中,在命中“{”时递增,到达“}”时递减来实现这一点。使用T4自动生成“包装类” 下面是关于如何实现FieldWrapper的建议
public class FieldWrapper<T, O>
{
private T _item;
private O _owner;
private PropertyInfo _setter;
public T Value
{
get { return _item; }
set {
if (!EqualityComparer<T>.Default.Equal(_item, value))
{
_item = value;
// do some personal check
_setter.SetValue(_owner, value);
}
}
}
public bool someBool;
public int someCounter;
// ..whatever
// CTOR
public FieldWrapper(O owner, Expression<Func<T, O>> propertyExpressionInTheOwner)
{
_owner = owner;
propertyName = (propertyExpressionInTheOwner.body as MemberExpression).Member.Name;
// get PropertyInfo using the owner and propertyName
}
}
这种技术的优点在于,如果您更改了person类,您将直接收到一个编译错误
对于T4,必须加载所有类所在的程序集,使用特定属性标记类模型。查看程序集,找到每个具有此属性的类,并生成包装类关联。您是否正在查看类似的内容@Eser否,我不这么认为。它在编译时似乎不满足类型安全性。。但是谢谢!你想解决的问题是什么?也许我们可以提供一个更好的解决方案?@MDeSchaepmeester谢谢你的提议,但不幸的是,我不得不使用这个“解决方案”。@shay_uuu坦率地说。。。找另一份工作:PThanks,但这是类创建的自动化,我正在寻找一种(可能不存在的)自动化声明的方法。这很有趣,我会检查一下!
var p = new Person();
new FieldWrapper(p, (pers) => pers.Name);