Skip to main content
GameDev.net gamedev.net
🔒 Locked

Return class and method of a delegate

Started by Headkaze Oct 10, 2012 at 9:55 AM 3 replies 1.7k views
Original Post
Headkaze
Headkaze
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 ???
}
Headkaze
Headkaze
This is what I've have so far and a few variations thereof. Am I on the right track?

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;
}
Headkaze
Headkaze
I thought I had it with

if (easeFunction.GetType().IsInstanceOfType(typeof(Linear)))

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

Still at a loss here.

Here is my delegate declaration

public delegate double EaseDelegate(double start, double end, double duration, double elapsedTime);

And here is the Ease class

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)".
Anthracis
Anthracis
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.
Headkaze
Headkaze
Thanks Anthracis.

Topic Locked

This topic has been locked by a moderator. New replies are not allowed.

Sign in to reply to this topic.