Jump to content

  • Log In with Google      Sign In   
  • Create Account

We're offering banner ads on our site from just $5!

1. Details HERE. 2. GDNet+ Subscriptions HERE. 3. Ad upload HERE.


Return class and method of a delegate


Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

  • You cannot reply to this topic
4 replies to this topic

#1 Headkaze   Members   -  Reputation: 583

Like
0Likes
Like

Posted 10 October 2012 - 03:55 AM

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 ???
}


Sponsor:

#2 Headkaze   Members   -  Reputation: 583

Like
0Likes
Like

Posted 10 October 2012 - 06:05 AM

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;
}


#3 Headkaze   Members   -  Reputation: 583

Like
0Likes
Like

Posted 10 October 2012 - 11:03 AM

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)".

Edited by Headkaze, 10 October 2012 - 11:17 AM.


#4 Anthracis   Members   -  Reputation: 296

Like
1Likes
Like

Posted 11 October 2012 - 06:33 AM

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.

#5 Headkaze   Members   -  Reputation: 583

Like
0Likes
Like

Posted 11 October 2012 - 07:56 AM

Thanks Anthracis.




Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.



PARTNERS