在C#中将值类型更改为引用类型的最佳方法是什么?

查尔斯·W

我定义了三个类,如下所示:

public class Base
{
    public int Id { get; set; }
}

public class Bar : Base { ... }

public class Foo : Base
{
    public int? ParentId { get; set; }
    public Base Parent { get; set; }

    public int? FooParentId { get; set; }
    public Foo FooParent { get; set; }

    public int? BarParentId { get; set; }
    public Bar BarParent { get; set; }

    public Foo(Foo parent)
    {
        FooParent = parent;
        FooParentId = parent.Id;

        Parent = FooParent; // Now changes to Parent are reflected on FooParent
        ParentId = FooParentId; // Changes to ParentId are not reflected because it is a value type.
    }
    public Foo(Bar parent)
    {
        // Same implementation as ctor(Foo parent);
    }
}

我正在尝试做的是Parent引用FooParentBarParent(我相信这很简单),然后ParentId引用FooParentIdBarParentId制作ParentId引用类型的最明智的方法是什么?

这里的答案提到整数的装箱/拆箱有很多与其相关的问题。
这真的是一个不好的解决方案吗?

编辑:
我应该已经提到过,Foo并且Bar是实体框架表。Foo是一个对象,可以是一个表或其他的孩子,以及用于实体框架代码优先正确地生成该表中,既FooParentBarParent必须被定义。此外,ParentId可能不会Parent在其吸气剂中引用实体框架也应为此负责。调用时,实体框架会重新插入现有对象context.Set<Foo>().Add(newItem);所有不为null的Parents都会重新插入。

瑞安·埃默尔(Ryan Emerle)

如果您的双手受到EF的束缚,则可以使用委托ParentId基于构造函数中传递的类型来传播的更改我不知道EF是否会对此抱怨。

例如,使用Action<T>委托,我们可以将更改转发ParentId到相应的[Foo|Bar]ParentId

public class Base
{
    public int Id { get; set; }
}

public class Bar : Base {  }

public class Foo : Base
{
    private int? _parentId;

    public int? ParentId { 
        get{ return _parentId; } 
        set{ 
            _parentId = value;
            if( OnParentChangeAction != null ) {
                OnParentChangeAction( _parentId ); 
            }
        } 
    }

    public Base Parent { get; set; }

    public int? FooParentId { get; set; }
    public Foo FooParent { get; set; }

    public int? BarParentId { get; set; }
    public Bar BarParent { get; set; }

    private Action<int?> OnParentChangeAction{ get; set; }

    public Foo(Foo parent)
    {
        FooParent = parent;
        FooParentId = parent.Id;

        Parent = FooParent;
        ParentId = FooParentId;
        OnParentChangeAction = newParentId => FooParentId = newParentId;
    }
    public Foo(Bar parent)
    {
        BarParent = parent;
        BarParentId = parent.Id;

        Parent = BarParent; 
        ParentId = BarParentId; 
        OnParentChangeAction = newParentId => BarParentId = newParentId;
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在C#中将int类型更改为char类型

为什么在C#中将字节值分配给动态变量会导致动态更改为字节数据类型?

C#中引用类型变量的“ ref”用法是什么?

C# 引用类型替代值类型

在pyspark中将值随机更改为空值的最有效方法是什么?

在C#中将值类型用作引用类型的可能性

在“ C#”中将“值类型”装箱为“引用类型”时需要多少内存?

在 MVC 程序的视图中将类型转换为列表的最佳方法是什么?

在Chapel中将数组类型约束为具有连续数据的本地数组的最佳方法是什么?

从 C# 中的 SQLite 数据库获取 REAL/DOUBLE 类型的值的好方法是什么

如何在WPF C#中将类型从ObservableCollection <object>更改为ObservableCollection <class>

这是什么类型的数据,并且可以更改为JSON

在Postgres的c#中获取表字段的数据库数据类型的最佳最快方法是什么?

C#方法签名-限制类型-正确的术语是什么?

C#中“方法”本身的类型是什么?

最佳的内容类型是什么?

在C#中,为什么String是行为类似于值类型的引用类型?

检查所有 JSON 属性值类型的最佳方法是什么?

存储值类型变量C#的引用

引用类型的定义是什么?

C#集合是值类型还是引用类型?

引用对象的属性名称和值对类型的正确方法是什么?

在python中将实例类型更改为继承

在C#中将相似对象存储在字典中的最佳方法是什么?

在 C# 中将 List <string> 转换为 List<type> 的最佳方法是什么

在C#中将动态行数插入SQL Server的最佳方法是什么

左值引用类型是什么意思

关于右值引用的困惑:它的类型是什么?

从捕获中排除异常类型的最佳方法是什么?