First, I'm so sorry because my bellow stupid question. But I hope someone can help me on this approach.
I have an Enum that I want to be add new magic attribute as described:
public enum FunctionType
{
[CallMethod(ExecuteFunction.DOPLUS)] //How to implement CallMethod magic attribute
PLUS,
[CallMethod(ExecuteFunction.DOMINUS)]
MINUS,
[CallMethod(ExecuteFunction.DOMULTIPLY)]
MULTIPLY,
[CallMethod(ExecuteFunction.DODIVIDE)]
DIVIDE
}
My class has a FunctionType property like this:
public class Function
{
private FunctionType _functionType;
public List<object> Params
{ get; set; }
public FunctionType FunctionType
{
get { return _functionType; }
set { _functionType = value; }
}
public string Execute()
{
return SomeMagicMethod(this.FunctionType); //How to implement this method to return my result as expected
}
}
Last, my calculate class has some functions return result:
public static class ExecuteFunction
{
public static string DOPLUS(int a, int b)
{
return (a + b).ToString();
}
public static string DOMINUS(int a, int b)
{
return (a - b).ToString();
}
public static string DOMULTIPLY(int a, int b)
{
return (a * b).ToString();
}
public static string DODIVIDE(int a, int b)
{
return (a / b).ToString();
}
}
My stupid question is: How can I implement CallMethodAttribute in enum and SomeMagicMethod above to run specified method without using switch case as normal ?
You can't put a reference to a method in an attribute as you wrote (it is not compile-time).
Your approach is wrong - You should decorate the methods with an attribute referring their corresponding enum, like this:
The attribute code:
And then detect the corresponding method for a given enum value type with reflection and invoke it:
Of course, optimizations can be done such as caching a compiled delegate using Delegate.CreateDelegate.
If you're ready to replace your attributes with a mapping dictionary: