• Advertisement
Sign in to follow this  

Return class and method of a delegate

This topic is 1925 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

I have a method that takes two enums and returns a delegate based on their values.

ie.
[code]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;
...
}
}[/code]

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.

[code]public static EaseCategory GetEaseCategory(EaseDelegate easeFunction)
{
// return ???
}
public static EaseType GetEaseType(EaseDelegate easeFunction)
{
// return ???
}[/code]

Share this post


Link to post
Share on other sites
Advertisement
This is what I've have so far and a few variations thereof. Am I on the right track?

[code]public static EaseCategory GetEaseCategory(EaseDelegate easeFunction)
{
if (easeFunction.GetType() == typeof(Linear))
return EaseCategory.Linear;
else if (easeFunction.GetType() == typeof(Quadratic))
return EaseCategory.Quadratic;
return EaseCategory.Sine;
}
public static EaseType GetEaseType(EaseDelegate easeFunction)
{
if (easeFunction.Method.GetType() == new EaseDelegate(Linear.EaseIn).Method.GetType())
return EaseType.EaseIn;
else if (easeFunction.Method.GetType() == new EaseDelegate(Linear.EaseOut).Method.GetType())
return EaseType.EaseOut;
return EaseType.EaseNone;
}[/code]

Share this post


Link to post
Share on other sites
I thought I had it with

[code]if (easeFunction.GetType().IsInstanceOfType(typeof(Linear)))[/code]

To check if the object was an instance of Linear. Not so.

Still at a loss here.

Here is my delegate declaration

[code]public delegate double EaseDelegate(double start, double end, double duration, double elapsedTime);[/code]

And here is the Ease class

[code]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;
}
}
}[/code]

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)". Edited by Headkaze

Share this post


Link to post
Share on other sites
Hi,

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]

Hope this helps with your problem.

Share this post


Link to post
Share on other sites
Sign in to follow this  

  • Advertisement