I have a method that takes two enums and returns a delegate based on their values.
ie. public static EaseDelegate GetEaseFunction(EaseCategory easeCategory, EaseType easeType)
{
switch (easeCategory)
{
case EaseCategory.Linear:
switch (easeType)
{
case EaseType.EaseIn:
return new EaseDelegate(Linear.EaseIn);
case EaseType.EaseOut:
return new EaseDelegate(Linear.EaseOut);
case EaseType.EaseInOut:
return new EaseDelegate(Linear.EaseInOut);
case EaseType.EaseNone:
return new EaseDelegate(Linear.EaseNone);
}
break;
...
}
}
Note that in the above extract "Linear" is a static class and "EaseIn", "EaseOut" etc. are static methods. EaseDelegate is a delegate matching the method signatures in the class.
Now I need two methods that do the reverse; return the enum value based on the class and method of the delegate.
public static EaseCategory GetEaseCategory(EaseDelegate easeFunction)
{
// return ???
}
public static EaseType GetEaseType(EaseDelegate easeFunction)
{
// return ???
}
public static class Easing
{
public static class Linear
{
public static double EaseNone(double t, double b, double c, double d)
{
return c * t / d + b;
}
public static double EaseIn(double t, double b, double c, double d)
{
return c * t / d + b;
}
public static double EaseOut(double t, double b, double c, double d)
{
return c * t / d + b;
}
public static double EaseInOut(double t, double b, double c, double d)
{
return c * t / d + b;
}
}
}
Now if I pass in Easing.Linear.EaseIn as a "EaseDelegate easeFunction" parameter shouldn't easeFunction be an object? So why I can't I use "if(easeFunction is Linear)". I get "the expression is never of the provided type". I get the same if I use "if(easeFunction is Easing)".
the delegate type provides you with all the necessary information. Especially the "Method"-property is helpful for your need.
Its "DeclaringType" gives you the type where your delegate function is defined and with the "Name"-Property you receive the name of the actual method.
So your two methods could look like this:
[source lang="csharp"]
public static EaseCategory GetEaseCategory(EaseDelegate easeFunction)
{
if (easeFunction.Method.DeclaringType == typeof(Linear))
return EaseCategory.Linear;
else if (easeFunction.Method.DeclaringType == typeof(Quadratic))
return EaseCategory.Quadratic;
return EaseCategory.Sine;
}
public static EaseType GetEaseType(EaseDelegate easeFunction)
{
if (easeFunction.Method.Name == "EaseIn")
return EaseType.EaseIn;
else if (easeFunction.Method.Name == "EaseOut")
return EaseType.EaseOut;
return EaseType.EaseNone;
}
[/source]