动态地将属性添加到System.object?

时间:2011-11-21 15:03:23

标签: c# object properties

我得到了一个我在不同类中定义的不同对象的列表,我想为所有这些对象添加一个字符串属性“Name”。这可能吗?

我没有提供那么多代码,因为我的课程非常简单/经典。

提前感谢您的帮助!

(编辑:我不想从添加此属性的抽象类继承!事实上,我不想在我的所有类中修改定义我的对象。这就是我所谓的“动态”标题。

我想要的是:

myObject.AddProperty(string, "Name");

myObject.AddAttribute(string, "Name");

(我不知道它是如何被称为)

然后我可以做:

myObject.Name = "blaaa";

3 个答案:

答案 0 :(得分:2)

创建一个所有其他类都可以继承的抽象类:

public abstract class MyBaseClass
{
    public string MyCommonString { get; set; }
}

public class Foo : MyBaseClass
{
    public MyBaseClass() { }
}

//Create instance of foo
Foo myFoo = new Foo();

//MyCommonString is accessible since you inherited from base
string commonString = myFoo.MyCommonString;

编辑(根据新要求)

由于您不想触及DLL中的原始类,我会采用这种[类似]方法:

public abstract class MyBaseClass
{
    public string MyCommonString { get; set; }
}

//This class definition lives in the DLL and remains untouched
public class Foo
{
    public Foo() { }
}

//This partial class definition lives in [insert new project name here]
public partial class Foo : MyBaseClass
{
    public Foo () { }
}

请注意,Foo现在是一个部分类。你没有触及DLL中现有的类定义,而是扩展它。

编辑(根据新的新要求)

鉴于您的要求(不编辑原始课程),您所要求的是不可能的。

答案 1 :(得分:0)

您可以做的是对名为CustomProperties的Hashtable进行硬编码 现在,您可以使用自定义属性

填充此Hashtable

类似的东西:

        MyClass myClass = new MyClass();
        myClass.SetProperty("abc", 123);
        myClass.SetProperty("bcd", "bla");
        myClass.SetProperty("cde", DateTime.Now);

        MessageBox.Show(myClass.GetProperty("abc").ToString());

class MyClass
{
    private Hashtable MyProperties { get; set; }

    public MyClass()
    {
        MyProperties = new Hashtable();
    }

    public object GetProperty(string name)
    {
        return MyProperties.Contains(name) ? MyProperties[name] : null;
    }

    public void SetProperty(string name, object value)
    {
        if (MyProperties.Contains(name))
            MyProperties[name] = value;
        else
            MyProperties.Add(name, value);
    }
}

答案 2 :(得分:0)

您想使用新的C#4.0 dynamic关键字:

dynamic obj = new System.Dynamic.ExpandoObject();
obj.Value = 10;
var action = new Action<string>((l) => Console.WriteLine(l));
obj.WriteNow = action;
obj.WriteNow(obj.Value.ToString());

您无法使用object执行此操作,但ExpandoObject也可以。

但是......过度使用动态打字,你会发现自己在不久的将来会陷入维护噩梦。