我得到了一个我在不同类中定义的不同对象的列表,我想为所有这些对象添加一个字符串属性“Name”。这可能吗?
我没有提供那么多代码,因为我的课程非常简单/经典。
提前感谢您的帮助!
(编辑:我不想从添加此属性的抽象类继承!事实上,我不想在我的所有类中修改定义我的对象。这就是我所谓的“动态”标题。
我想要的是:
myObject.AddProperty(string, "Name");
或
myObject.AddAttribute(string, "Name");
(我不知道它是如何被称为)
然后我可以做:
myObject.Name = "blaaa";
答案 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
也可以。
但是......过度使用动态打字,你会发现自己在不久的将来会陷入维护噩梦。