C#通过添加属性来扩展类

这个问题在这里已经有了答案:

  • C#有扩展属性吗? 6个答案

  • 首先,你应该重新考虑你的方法。 但是,如果所有其他都失败了,这里是你如何可以添加一个属性到一个密封的类:

    using System;
    using System.Runtime.CompilerServices;
    
    namespace DataCellExtender
    {
    
        #region sample 3rd party class
        public class DataCell
        {
            public int Field1;
            public int Field2;
        }
        #endregion
    
        public static class DataCellExtension
        {
            //ConditionalWeakTable is available in .NET 4.0+
            //if you use an older .NET, you have to create your own CWT implementation (good luck with that!)
            static readonly ConditionalWeakTable<DataCell, IntObject> Flags = new ConditionalWeakTable<DataCell, IntObject>();
    
            public static int GetFlags(this DataCell dataCell) { return Flags.GetOrCreateValue(dataCell).Value; }
    
            public static void SetFlags(this DataCell dataCell, int newFlags) { Flags.GetOrCreateValue(dataCell).Value = newFlags; }
    
            class IntObject
            {
                public int Value;
            }
        }
    
    
        class Program
        {
            static void Main(string[] args)
            {
                var dc = new DataCell();
                dc.SetFlags(42);
                var flags = dc.GetFlags();
                Console.WriteLine(flags);
            }
        }
    }
    

    除非你确实需要,否则请不要这样做。 如果你有一个更清晰的解决方案,而你跳过这个稍微黑客的方法,这个代码的未来维护者可能会对你有一些强烈的话。


    那么你当然可以扩展一个类,只添加字段/属性(尽管我不鼓励按照你的示例使用公共字段)。 但是,除非其他代码使用您的新类,否则这些字段将不存在于创建的对象中。 例如,如果其他代码具有:

    DataCell cell = new DataCell();
    

    那么这将不会有您的Field1Field2字段。

    如果基类的每个实例都应该有这些字段,那么最好是研究如何更改基类,而不是扩展它。

    如果您想知道是否可以像添加扩展方法一样添加“扩展字段”(例如public static void Foo(this DataCell cell) ),那么不可以,那是不可能的。


    有两种方法可以将属性添加到现有类中

  • 添加部分类 ,但这不适合你,因为部分类应该在同一个程序集中。

  • 在不同的类中继承这个类 ,据我所知,这将是更好的解决方案。

  • 不,你不能像扩展方法那样使用扩展属性。

    链接地址: http://www.djcxy.com/p/96981.html

    上一篇: C# Extend class by adding properties

    下一篇: Constexpr conditions for constructor