0

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

BaseAppObject.GetUserString(string key, string value);
BaseAppObject.SetUserString(string key, ref string value);

我正在创建一组我自己的自定义类,它们充当围绕BaseAppObject. 我所有的类都派生自一个类Node,该类有一个字段来存储对BaseAppObject. Node派生的其他属性和类型Node使用关联实例的GetUserStringSetUserString方法BaseAppObject直接读取或写入关联实例的属性值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);
            }
    }
}

其他派生的类Node可能会添加类似这样的附加属性。

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.

4

3 回答 3

1

看起来您已经想出了如何重新生成以前存在的类。要生成一个没有值的干净对象,您所要做的就是提供一个额外的不带参数的重载并创建 _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";
于 2009-06-09T04:46:52.590 回答
1

我已经编写了一个基础包装器对象,我的所有包装器都继承自它。

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

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

    public bool IsNotNull()
    {
        return BaseItem != null;
    }
}
于 2009-06-09T04:48:32.400 回答
0

我不明白你为什么不想让Node成为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 一样使用 Node 对象,并且仍然可以使用附加功能。我认为这是实现包装类的更好方法。C# 中的类型转换非常棒,您应该利用它。

于 2009-06-09T04:49:17.860 回答