user3635120
user3635120

Reputation: 73

How to call a method in another class from a generic method?

Why doesn't the line marked with //Dont work in the bottom of the code compile?

I want to reuse the WriteMessage method with different Classes, I try to use generics, but I'm not sure how to use it.

class ClassOne
{
    public string MethodOne()
    {
        return ("ClassOne");
    }

    public string MethodTwo()
    {
        return ("ClassOne -MethodTwo ");
    }
}

class ClassTwo 
{
    public string MethodOne()
    {
        return ("ClassTwo");
    }

    public string MethodTwo()
    {
        return ("ClassOne -MethodTwo ");
    }
}

class Program
{
    private static void Main()
    {
        var objectOne = new ClassOne();
        WriteMessage(objectOne);

        var objectTwo = new ClassTwo();
        WriteMessage(objectTwo);
        Console.ReadKey();
    }

    public static void WriteMessage<T>(T objectA)
    {
        var text = objectA.MethodTwo();  //Dont Work
        Console.WriteLine("Text:{0}", text);
    }
}

Upvotes: 1

Views: 151

Answers (3)

BradleyDotNET
BradleyDotNET

Reputation: 61339

This doesn't compile because as far as the compiler is concerned objectA is just an Object.

To get this to work, you need to use a generic type constraint:

public interface MyInterface
{
   string MethodTwo();
}

public class A : MyInterface
{
   ...
}

public class B : MyInterface
{
   ...
}

public static void WriteMessage<T>(T objectA) where T: MyInterface
{
    var text = objectA.MethodTwo();  //Will Work!
    Console.WriteLine("Text:{0}", text);
}

MSDN : Constraints on Type Parameters

Upvotes: 2

Andrew
Andrew

Reputation: 5083

Since you're passing in a generically-typed object with T, the compiler doesn't know what class you're using--for all it knows, it could be an int or an Application or anything.

What you probably want is to have ClassOne and ClassTwo inherit from another class that has an abstract MethodTwo class that both implement. Something like...

abstract class SuperClass
{
    public abstract string MethodOne();
}

class ClassOne : SuperClass
{
    public override string MethodOne()
    {
        return ("ClassOne");
    }
}

then in Main:

public static void WriteMessage<T>(T objectA) where T : SuperClass
{
    var text = objectA.MethodOne();
    Console.WriteLine("Text:{0}", text);
}

Read up on C# inheritance here: http://msdn.microsoft.com/en-us/library/ms173149.aspx

Upvotes: 1

Jonas W
Jonas W

Reputation: 3250

Try implementing a interface :

Example :

public interface IHasTwoMethods
{
 string MethodOne()
 string MethodTwo()
}

Implement this inteface on your classes :

class ClassOne : IHasTwoMethods
class ClassTwo : IHasTwoMethods

Then in your generic method do like this :

public static void WriteMessage<T>(T objectA) where T : IHasTwoMethods
    {
        var text = objectA.MethodTwo();  //Will work
        Console.WriteLine("Text:{0}", text);
    }

You can read more about interfaces here : http://msdn.microsoft.com/en-us/library/87d83y5b.aspx

Upvotes: 4

Related Questions