使用属性注入

本文关键字:注入 属性 | 更新日期: 2023-09-27 18:21:03

我不确定这就是它的名字,但以下是我试图实现的:

我需要能够为属性、字段和类指定一个Attribute,并且每次指定了[Attribute]的对象都会调用某个静态函数。

我已经知道如何设置属性,但我不知道如何拦截每个对象的创建并调用其上的函数

如果不在类本身中插入某种代码,或者在类周围创建一个工厂来管理实例化,就无法拦截正在创建的对象。

假设你有一个这样的类:

public class MyData
{
    [Captialization]
    public string Name { get; set; }
}

具有如下定义的属性:

[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Class)]
public class CaptializationAttribute : Attribute { }

您可以检测和操作标记有各种属性的属性,如:

public static class DataUtilities
{
    public static void ApplyAttributes<T>(T obj)
    {
        // Capitalization attribute
        var props = typeof (T).GetProperties().Where(p => p.GetCustomAttributes(typeof (CaptializationAttribute), true).Any());
        foreach (var prop in props)
        {
            // This is just an example, if you use this code you 
            // should check if the property is a string first!
            prop.SetValue(obj, prop.GetValue(obj).ToString().ToUpper());
            // Or perform some other manipulation here.
        }
    }
}

现在,要自动调用此代码,您需要决定它何时发生。如果它在实例化之后很好,那么您可能不得不从某个地方自己调用它。但如果是在实例化过程中,您可以做以下两件事之一:

使用工厂:

public static class MyDataFactory
{
    public static MyData Create()
    {
        var myData = new MyData();
        DataUtilities.ApplyAttributes(myData);
        return myData;
    }
}

您可能希望使用内部构造函数来防止外部实例化。

// No instantiation from outside the assembly
internal MyData() { }

使用构造函数:

将对操作实用程序的调用添加到构造函数中:

public MyData()
{
    DataUtilities.ApplyAttributes(this);
}

还有其他方法可以做到这一点,比如使用代理、依赖注入,或者正如@Yuval-Itzchakov提到的那样,使用AOP框架,但我所描述的可能是最容易实现的。

使用属性注入