尝试在 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
参数。
考虑到 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
参数。