You will need to use reflection.
Get your class type, get its methods, then find those that have the correct attribute.
MethodInfo[] methods = yourClassInstance.GetType() .GetMethods()).Where(m => { var attr = m.GetCustomAttributes(typeof(WorkItem), false); return attr.Length > 0 && ((WorkItem)attr[0]).Value == 5555; }) .ToArray();
Please note that you can check multiple attributes if you wish.
Then you need to use an instance of the parent class as the target to run these methods.
foreach (var method in methods) { method.Invoke(yourClassInstance, null); }
If your methods have parameters, replace null with object[] containing the parameters.
Here is a complete working example:
using System; using System.Collections.Generic; using System.Linq; using System.Reflection; namespace ConsoleApplication7 { public class MyAttribute : Attribute { public MyAttribute(int val) { Value = val; } public int Value { get; set; } } class Test { [MyAttribute(1)] public void Method1() { Console.WriteLine("1!"); } [MyAttribute(2)] public void Method2() { Console.WriteLine("2!"); } [MyAttribute(3)] public void Method3() { Console.WriteLine("3!"); } [MyAttribute(1)] public void Method4() { Console.WriteLine("4!"); } } class Program { static void Main(string[] args) { var test = new Test(); var types = Assembly.GetAssembly(test.GetType()).GetTypes(); MethodInfo[] methods = test.GetType().GetMethods() .Where(m => { var attr = m.GetCustomAttributes(typeof(MyAttribute), false); return attr.Length > 0 && ((MyAttribute)attr[0]).Value == 1; }) .ToArray(); foreach (var method in methods) { method.Invoke(test, null); } } } }
source share