Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#-是否可以声明一个类,其中所有字段都是另一个类的包装器';s场?_C#_.net_Class_Oop - Fatal编程技术网

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);