反思,动态。如何用另一个替换一个对象?

时间:2012-05-24 17:56:11

标签: c#

我有一个像这样的对象

public class Simple
{
    public string Value
    {
      get { return GetProperty(); }
    }

    // different methods, fields, events, etc.
}

可以使用相同的对象替换类 Simple 的实例,但是使用setter?

如何实施......

private object Substitution(object simple)
{
    object newSimple;

    // implementations

    newSimple.Value = "data";
    return newSimple;
}

要有这样的东西

public class Simple
{
    public string Value { get; set; }

    // my methods, fields, events ...
}

我想创建一个类并从SystemObject继承,然后你可以创建不同的动态属性,但是不能这样做:(

或者也许尝试从这个对象继承(如何?)并覆盖属性?

由于

2 个答案:

答案 0 :(得分:0)

您无法在运行时更改已加载类型的定义或结构。

您可能会创建一个具有类似属性和字段集的新类型,并添加了属性设置器。但是,在大多数情况下,这将是有限的用途,因为现有代码将无法理解新类型(因为它是运行时生成的),因此仍然会处理现有类型,这将不兼容。

通常,如果您需要某个类型中的运行时可扩展性,还有其他选项,包括使用Dictionary<T,U>dynamicExpandoObject,或其他一些机制来存储“额外”类中的信息在编译时是未知的。

答案 1 :(得分:0)

你总是使用一个只定义属性getter的接口。然后在实现中有一个属性setter?

class Program
{
    static void Main(string[] args)
    {
        IMyClass myA = new ClassA{ Property = "Class A" };

        Console.WriteLine(myA.Property);

        // can't do this
        // myA.Property = "New Property"; 

        // can do this
        (myA as ClassA).Property = "New Property"; 
        Console.WriteLine(myA.Property);
    }
}

interface IMyClass
{
    string Property { get; }
}

class ClassA : IMyClass
{
    public string Property { get; set; }
}

如果失败,您可以使用显式关键字more info at MSDN

执行用户定义的转化