如何在不更改基本类型的情况下向对象添加属性

时间:2017-08-08 13:38:54

标签: c# .net dynamic proxy aop

问题是如何在不使用继承且不更改基类型的情况下向对象消息添加一些属性。以下是我的想法: 假设我有一条对象消息,可以将我的消息从服务层传送到前端,如下所示:

为了清除亲爱的开发人员,我不允许从任何接口或基类继承我的result因为你看到我的result类型是对象我想保留它的对象和客户端使用这些假设结果是一个对象。我们不想在客户端改变任何东西

public object DoSomething(param parameters)
{
    .
    list<MyObject> result= ...
    return result;
}

好的,现在在前端,我有:

public object GetResult(param parameters)
{
    ...
    return _service.DoSomething(parameteres);
}

用法:

{
        .
        .
        var result=GetResult(...);
        if (**result.Status**==Success)
        {
            .
            foreach(var item on result)
            {
               ...
            }
        }
}

正如您所看到的那样,我希望拥有一个类似于&#39; status&#39;在我的结果或任何其他属性。我认为使用代理或一些Aspect编程技术可以帮助我 我需要在运行时向现有对象添加属性 - 不改变对象基类或实现任何其他界面

2 个答案:

答案 0 :(得分:0)

您是否考虑过使用 C#扩展名,可以在其中添加方法到object类型?是的,我知道您需要属性,但尚不允许在C#中扩展属性: Does C# have extension properties?

答案 1 :(得分:-1)

实现此目的的一种方法是使用ExpandoObject。您可以将对象创建为可扩展对象,这样您就可以动态添加新属性

    using System.Collections.Generic;
using System.Dynamic;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            dynamic result = GetResult();
            if (result.Status == "Success")
            {
                foreach (var item in result.list)
                {

                }
            }
        }

        public static ExpandoObject DoSomething()
        {

            dynamic result = new ExpandoObject();
            result.list = new List<MyObject>();
            return result;
        }

        public static ExpandoObject GetResult()
        {
            return DoSomething();
        }
    }

    internal class MyObject
    {
    }
}

这里是代码,告诉你如何做到这一点