我正在为使用.NET API的应用程序编写插件。程序的对象可以通过根对象类型的两种方法应用自定义属性,这两种方法将键/值对分配给对象。
BaseAppObject.GetUserString(string key, string value);
BaseAppObject.SetUserString(string key, ref string value);
我正在创建一组自己的自定义类,它们充当BaseAppObject
实例的包装类。我的所有类都派生自一个类Node
,它有一个字段来存储对BaseAppObject
的引用。 Node
的其他属性和从Node
派生的类型使用关联的GetUserString
实例的SetUserString
和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);
}
}
}
我正在尝试找出设置构造函数和类的其他方法来启动和重新生成类的实例的最佳方法。我需要能够基于{em> clean 实例创建我的类的新实例,这些实例没有定义用户字符串,并且还根据用户字符串重新生成以前现有的类实例存储在现有的BaseAppObject
。
答案 0 :(得分: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";
答案 1 :(得分: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;
}
}
答案 2 :(得分:0)
我不明白为什么你不想让 Node 成为 BaseClassObj 的子类。如果您正在编写包装类,则可以使用类型转换功能使您的“Node”类及其所有子类直接与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#中的类型转换很棒,你应该利用它。