C#通过添加属性来扩展类
这个问题在这里已经有了答案:
首先,你应该重新考虑你的方法。 但是,如果所有其他都失败了,这里是你如何可以添加一个属性到一个密封的类:
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();
那么这将不会有您的Field1
和Field2
字段。
如果基类的每个实例都应该有这些字段,那么最好是研究如何更改基类,而不是扩展它。
如果您想知道是否可以像添加扩展方法一样添加“扩展字段”(例如public static void Foo(this DataCell cell)
),那么不可以,那是不可能的。
有两种方法可以将属性添加到现有类中
添加部分类 ,但这不适合你,因为部分类应该在同一个程序集中。
在不同的类中继承这个类 ,据我所知,这将是更好的解决方案。
不,你不能像扩展方法那样使用扩展属性。
链接地址: http://www.djcxy.com/p/96981.html