每当调用属性时调用方法

Gys*_*yer 5 c# reflection attributes dynamic

有没有办法向类添加一个属性或类似的东西,每当调用该类的属性时,将调用一个方法?

基本上我有包含数据行的类,而不是像以下那样访问单个列:(DataRow ["some_column_name"])我想使用属性来访问它们,如:(MyClass.some_column_name).

我目前的工作是使用反射动态传递列名作为参数,如下所示:

public string some_column_name
    {
        get
        {

            return (string)GetValue(MethodBase.GetCurrentMethod().Name);
        }
        set
        {
            SetValue(MethodBase.GetCurrentMethod().Name, value);
        }
    }
Run Code Online (Sandbox Code Playgroud)

上面提到的方法的问题是,如果我有一个包含10个属性的类,那么所有这些属性都将在其中使用上面的代码片段.

下面的代码示例包含上面代码片段的get和set value方法,这些方法将在基类中:

private DataRow some_table;

protected object GetValue(string columnName)
{
    return some_table[columnName.Substring(columnName.IndexOf('_') + 1)];
}

protected object SetValue(string columnName, object value)
{
    return  some_table[columnName.Substring(columnName.IndexOf('_') + 1)] = value;
}
Run Code Online (Sandbox Code Playgroud)

Mri*_*boj 0

以下是使用 的代码的简单工作版本PostSharp AOP。当我们修剪和时,这里的结果将是TestProperty。中还有更多的处理可能,可用于对调用者进行大量修改,然后我们可以选择从 PostSharp 调用本身返回或进一步执行该方法。您还可以计划使用 AOP 函数,例如,它可以在方法成功或失败时执行get_set_OnInvokeMethodInterceptionArgsOnMethodBoundaryAspect

namespace TestAOP
{
    class Program
    {
        static void Main(string[] args)
        {
           var t = new Test();

           var x = t.TestProperty;

           Console.WriteLine(x);

           Console.Read();
        }
    }

    public class Test
    {
        private string _test = "InitialValue";

        [CustomProperty]
        public string TestProperty
        {
            get => _test;
            set => _test = value;
        }
    }

    [Serializable]
    public sealed class CustomPropertyAttribute : MethodInterceptionAspect
    {
        public override void OnInvoke(MethodInterceptionArgs args)
        {
           args.ReturnValue = args.Method.Name.Substring(args.Method.Name.IndexOf("_", StringComparison.Ordinal) + 1);

        }
    }
}
Run Code Online (Sandbox Code Playgroud)