尝试在 C# 中构建自定义条件属性

trying to build custom conditional attribute in C#

考虑到 c# 中的默认 conditional attribute 仅适用于 void 方法,我正在尝试构建自己的方法。

我下面的代码也可以在 http://ideone.com/FSOMKi 上找到,我没有遇到编译器错误,但这里看起来出了点问题:(

using System;
using System.Collections.Generic;  // for HashSet
using System.Linq;    // for using Where
using System.Reflection;

namespace attribute
{
public class Test
{
    public static void Main()
    {
        var targetClasses = new HashSet<string>(new[] { "Foo", "Foo2" });
        var targetFns = new HashSet<string>(new[] { "fn", "fn2", "fn3" });

        foreach (var target in targetClasses){
            foreach(var fn in targetFns){
               var method = (target.GetType().GetTypeInfo()) // (typeof(Foo).GetTypeInfo())
                 .DeclaredMethods.Where(x => x.Name == fn).FirstOrDefault();
                if (method != null) //return 0;
                {
                var customAttributes = (MyCustomAttribute[])method
                                       .GetCustomAttributes(typeof(MyCustomAttribute), true);
            if (customAttributes.Length > 0)
            {
                var myAttribute = customAttributes[0];
                bool value = myAttribute.condition;
                 Console.WriteLine(value);
                if (value == true)
                    method.Invoke(null, null);
                else
                    Console.WriteLine("The attribute parameter is not as required");
            }
                }
        }
        }
    }
}
}


namespace attribute
{
    [AttributeUsage(AttributeTargets.All)]
    public class MyCustomAttribute : Attribute
    {
        public bool condition { get; set; }
    }


    public class Foo
    {
        [MyCustom(condition= true ? ("bar" == "bar") : false)]
        internal static void fn()
        {
            Console.WriteLine("a function in a class");
        }

        [MyCustom(condition= true ? (1 == 2) : false)]
        internal static void fn2()
        {
            Console.WriteLine("another function in the same class");
        }
    }

    public class Foo2
    {
        [MyCustom(condition= true ? (1 == 1) : false)]
        internal static void fn2()
        {
            Console.WriteLine("another function in a nother class");
        }
    }
}

输出应该是如下三行:

class中的函数 属性参数不符合要求 另一个 class

中的另一个函数

您的问题需要大量重构。

但是,据我所知,您正在构建一个自定义条件属性,而编译器似乎并不知道它。

您的方法中的问题是,现有的 ConditionalAttribute 是 C# 编译器知道的特殊情况。当调用的方法使用此属性修饰时,编译器将采取特殊的编译操作。

在这方面,您不能定义另一个条件属性,因为编译器不会意识到它的含义。

在相关说明中,ConditionalAttribute 不能应用于返回非 void 的方法,因为它的应用程序指示编译器删除对该方法的调用。您可以跳过调用的唯一一种方法是您不希望从中调用的方法 - 这些方法返回 void 并且没有 out 参数。