4 Stimmen

unterschiedlicher Rückgabetyp einer Methode in einer generischen Klasse

Der folgende Code ist nur ausgedacht, ist dies möglich, mit C # zu tun?

class A
{
    public int DoStuff()
    {
        return 0;
    }
}

class B
{
    public string DoStuff()
    {
        return "";
    }
}

class MyMagicGenericContainer<T> where T : A, B
{
    //Below is the magic <------------------------------------------------
    automaticlyDetectedReturnTypeOfEitherAOrB GetStuff(T theObject)
    {
        return theObject.DoStuff();
    }
}

6voto

Amy B Punkte 104656

Ihr Wunsch ist mir Befehl.

public interface IDoesStuff<T>
{
  T DoStuff();
}

public class A : IDoesStuff<int>
{
  public int DoStuff()
  {  return 0; }
}

public class B : IDoesStuff<string>
{
  public string DoStuff()
  { return ""; }
}
public class MyMagicContainer<T, U> where T : IDoesStuff<U>
{
  U GetStuff(T theObject)
  {
    return theObject.DoStuff();
  }
}

Wenn Sie eine geringere Kopplung wünschen, können Sie dies tun:

public class MyMagicContainer<U>
{
  U GetStuff(Func<U> theFunc)
  {
    return theFunc()
  }
}

2voto

CodingWithSpike Punkte 41513

Die Methode, die am Ende automaticlyDetectedReturnTypeOfEitherAOrB() aufruft, müsste allerdings den Rückgabetyp kennen. Es sei denn, Sie lassen die Methode ein Objekt zurückgeben. Dann kann die aufrufende Methode zurückbekommen, was auch immer (int oder string) und herausfinden, was damit zu tun ist.

Eine andere Möglichkeit ist, wie folgt vorzugehen: (Entschuldigung, ich habe VisStudio nicht geöffnet, um die Syntax zu überprüfen oder zu sehen, ob es richtig funktioniert)

R GetStuff<R>(T theObject)
{
    return (R)theObject.DoStuff();
}

void Method1()
{
    int i = GetStuff<int>(new A());
    string s = GetStuff<string>(new B());
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X