Динамически добавить свойство в System.object? - PullRequest
1 голос
/ 21 ноября 2011

Я получил список различных объектов, которые я определил в разных классах, и я хотел бы добавить строковое свойство «Имя» для всех этих объектов.Это возможно?

У меня не так много кода, чтобы предоставить его, потому что мои уроки очень простые / классические.

Заранее спасибо за любую помощь!

(edit: я не хочу наследовать от абстрактного класса, который добавляет это свойство! На самом деле, я вообще не хочу изменять мой класс, который определяет мой объект. Это то, что я называю «Динамически» в заголовке.

То, что я хочу, это что-то вроде:

myObject.AddProperty(string, "Name");

или

myObject.AddAttribute(string, "Name");

(я не знаю, как это точно называется)

, а затемЯ могу сделать:

myObject.Name = "blaaa";

Ответы [ 3 ]

2 голосов
/ 21 ноября 2011

Создайте абстрактный класс, который могли бы наследовать все ваши другие классы:

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, вы расширяете его.

РЕДАКТИРОВАТЬ (в соответствии с новыми требованиями)

Учитывая ваши требования (без редактирования оригинального класса), то, что вы спрашиваете, невозможно.

0 голосов
/ 21 ноября 2011

Вы хотите использовать новое ключевое слово 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 прекрасно подойдет.

Но ... злоупотребляйте динамической типизацией, и в ближайшем будущем вы окажетесь в кошмаре обслуживания.

0 голосов
/ 21 ноября 2011

Что вы можете сделать, это жестко закодировать Hashtable с именем CustomProperties Теперь вы можете заполнить этот 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);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...