Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.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# 为包装类编写构造函数的正确方法是什么?_C#_Wrapper - Fatal编程技术网

C# 为包装类编写构造函数的正确方法是什么?

C# 为包装类编写构造函数的正确方法是什么?,c#,wrapper,C#,Wrapper,我正在为一个带有.NETAPI的应用程序编写插件。程序的对象可以通过两种根对象类型的方法应用自定义属性,这两种方法将键/值对分配给对象 BaseAppObject.GetUserString(string key, string value); BaseAppObject.SetUserString(string key, ref string value); 我正在创建一组我自己的自定义类,它们充当BaseAppObject实例周围的包装类。我的所有类都派生自一个类节点,该节点有一个字段来存

我正在为一个带有.NETAPI的应用程序编写插件。程序的对象可以通过两种根对象类型的方法应用自定义属性,这两种方法将键/值对分配给对象

BaseAppObject.GetUserString(string key, string value);
BaseAppObject.SetUserString(string key, ref string value);
我正在创建一组我自己的自定义类,它们充当
BaseAppObject
实例周围的包装类。我的所有类都派生自一个类
节点
,该节点有一个字段来存储对
BaseAppObject的引用
Node
的其他属性以及从
Node
派生的类型使用关联的
BaseAppObject
实例的
GetUserString
SetUserString
方法直接向关联的
BaseAppObjects
读取或写入属性值

这样,当应用程序关闭时,以后重新生成这些包装类所需的所有信息都存储在实际文档中

下面是我的基类构造函数的简化版本:

public abstract class Node
{
    BaseAppObject _baseObject;

    public Node(BaseAppObject baseObject, string name)
    {
        this._baseObject = baseObject;
        this.Name = name;
    } 

    public string Name
    {
        get { 
                string name = "";
                _baseObject.GetUserString("CPName", ref name);
                return name;             
            }

        set {
                _baseObject.SetUserString("CPName", value);
            }
    }
}
节点
派生的其他类可以添加这样的附加属性

public CustomClass:Node
{
    public CustomClass(BaseAppObject baseObj,string name, string color):base(baseObj,name)

    public string Color
    {
        get { 
                string name = "";
                this.BaseObject.GetUserString("Color", ref name);
                return name;             
            }

        set {
                this.BaseObject.SetUserString("Color", value);
            }
    }
}

我试图找出设置类的构造函数和其他方法的最佳方法,以启动和重新生成类的实例。我需要能够基于未定义用户字符串的
BaseAppObject
的干净实例创建我的类的新实例,还可以根据存储在现有
BaseAppObject
中的用户字符串重新生成以前存在的my类实例。看起来您已经找到了如何重新生成以前存在的类的方法。要生成一个没有值的干净对象,只需提供一个额外的重载,该重载不接受任何参数并创建_baseObject。以这种方式创建对象后,可以使用其属性设置成员值

public abstract class Node
{
    BaseAppObject _baseObject;
    //Empty constructor
    public Node() 
    {
        BaseAppObject = new BaseAppObject();
    }
    public Node(BaseAppObject baseObject, string name)
    {
        this.BaseObject = baseObject;
        this.Name = name;
    } 

    public string Name
    {
        get { 
                string name = "";
                _baseObject.GetUserString("CPName", ref name);
                return name;             
            }

        set {
                _baseObject.SetUserString("CPName", value);
            }
    }
}

public CustomClass:Node
{
    // Empty constructor
    public CustomClass() : Base() {}
    public CustomClass(BaseAppObject baseObj,string name, string color):base(baseObj,name)

    public string Color
    {
        get { 
                string name = "";
                this.BaseObject.GetUserString("Color", ref name);
                return name;             
            }

        set {
                this.BaseObject.SetUserString("Color", value);
            }
    }
}
创建空对象并填充它的示例代码:

CustomClass node = new CustomClass();
node.Name = "foo";
node.Color = "bar";

我已经编写了一个基本包装器对象,我的所有包装器都从中继承

public abstract class BaseWrapper<TBaseType> 
    where TBaseType : class
{
    protected readonly TBaseType BaseItem;

    protected BaseWrapper(TBaseType value)
    {
        BaseItem = value;
    }

    public bool IsNotNull()
    {
        return BaseItem != null;
    }
}
公共抽象类BaseWrapper
其中TBaseType:class
{
受保护的只读TBaseType BaseItem;
受保护的BaseWrapper(TBaseType值)
{
BaseItem=值;
}
公共bool IsNotNull()
{
返回BaseItem!=null;
}
}

我不明白为什么您不想将节点设为BaseClassObj的子类。如果您正在编写一个包装类,那么可以使用类型转换特性使您的“节点”类及其所有子类直接与BaseClassObj兼容

如果你这么做了,你可以说

public abstract class Node : BaseAppObject
{

    public Node(string name) : base()
    {            
        this.Name = name;
    } 

    public string Name
    {
        get { 
                string name = "";
                this.GetUserString("CPName", ref name);
                return name;             
            }

        set {
                this.SetUserString("CPName", value);
            }
    }
}

现在,您可以像BaseClassObj一样使用节点对象,并且仍然可以使用附加功能。我认为这是实现包装器类的更好方法。C#中的类型转换非常出色,您应该充分利用它。

好吧,但是如何用这个版本的Node包装BaseApObject的现有实例?我不能创建BassAppObject的实例,而是在用户选择它们时获取对它们的引用。我认为与其创建一个空类,不如创建一个只接受BaseAppObject参数的构造函数。上面的代码在基类中省略了包装类访问_基本物体,嗯?您的节点构造函数毫无意义。不能接受“BaseAppObject baseObject”参数并将this.baseObject属性设置为该参数。This.BaseObject是字符串属性而不是BaseAppObject属性。但这仍然不起作用。我不能只是实例化一个BaseAppObject。该应用程序是一个三维建模程序,BaseApObject是基础几何体对象。访问BaseAppObject实例的唯一方法是查找对文档中已有的现有实例的引用。最终,我认为有一个用于初始化这些包装类和设置用户字符串的构造函数,以及另一个用于稍后从用户字符串重新初始化它们的构造函数将起作用。我唯一的抱怨是似乎没有办法强制这种实现。如果我/其他人从我的基类创建了派生类,我必须记住/告诉他们正确的方法是创建一个用于初始化的构造函数和另一个用于重新初始化的构造函数。所以我希望有一种方法可以使这个实现成为类本身的固有特性。这并不适用于我的情况,因为我知道我将始终包装相同类型的对象。