【问题标题】:Injection using Attributes使用属性注入
【发布时间】:2014-11-02 00:28:32
【问题描述】:

我不确定这就是所谓的,但这是我想要实现的目标:

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

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

【问题讨论】:

  • 也许使用自定义属性,并从该类的构造函数中调用静态方法?
  • 据我所知,没有办法“拦截”创建对象。您需要创建一个Factory 以帮助创建您的对象,以便它可以扫描并作用于每个属性。
  • 你可以为这样的对象创建一个基类来检查其构造函数中的属性,只要基构造函数在类构造函数之前执行没有问题。
  • 我从未尝试过,但@BradleyDotNET 似乎在正确的轨道上。考虑到该属性是一个将在应用它的类的上下文中实例化的类,这可能会有所帮助。
  • 为什么不从构造函数中调用呢?

标签: c# reflection attributes


【解决方案1】:

如果不向类本身插入某种代码或在类周围创建Factory 来管理实例化,则无法拦截正在创建的对象。

假设你有这样的课程:

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);
}

还有其他方法可以做到这一点,例如使用ProxyDependency Injection,或@Yuval Itzchakov 提到的AOP framework,但我描述的那些可能是最容易实现的。

【讨论】:

    猜你喜欢
    • 2012-04-23
    • 1970-01-01
    • 1970-01-01
    • 2013-09-17
    • 2016-07-05
    • 2011-09-19
    • 2012-08-06
    • 2015-06-13
    • 2010-12-27
    相关资源
    最近更新 更多