Lösung 1
Sie dieses Problem durch die Verwendung einer gemeinsamen Schnittstelle lösen können. Diese Schnittstelle wird von Ihrer Klasseninstanz helper (createGenericClass
) verwendet und von Ihren anderen Schnittstellen verwendet, die Sie auch übergeben möchten. Nennen wir es IBaseService
.
public class createGenericClass<T>
where T : IBaseService // telling T can be only IBaseService and inherited stuff.
{
public void CallDoSomeThing(T t, int x, int y)
{
(t as IWebService)?.DoSomeThing(x, y); // casting and validating
}
public void CallDoSomeThingElse(T t, int a, float b)
{
(t as IVoiceService)?.DoSomeThingElse(a, b); // casting and validating
}
}
public interface IBaseService{} // only gives a common parent to other interfaces. Common properties, methods can be included here.
public interface IWebService : IBaseService // inheriting the common interface
{
void DoSomeThing(int x, int y);
}
public interface IVoiceService : IBaseService // inheriting the common interface
{
void DoSomeThingElse(int a, float b);
}
So konnten Sie Ihre Hilfsklasse auf diese Weise instanziiert:
class Program
{
static void Main(string[] args)
{
var obj = new createGenericClass<IBaseService>();
obj.CallDoSomeThing(new Web_Service(), 1, 2); // works well
obj.CallDoSomeThingElse(new Voice_Service(), 3, 4); // works well
}
}
Hinweis: auch gibt es mehrere Schritte, die Sie die Verwendung von Ihnen Hilfsklasse, wie zum Beispiel die Nutzung könnte zu vereinfachen die Helper-Klasse static (vielleicht Singleton) ohne Generics und Generics nur für Methoden verwenden. Auf diese Weise müssten Sie die Klasse nicht instanziieren.
jedoch diese „Vereinfachung“ Modifikationen Leistung und Benutzerfreundlichkeit auf Ihre Ziele, auf die Anwendungsbedingungen abhängen würde, auf die Daten und andere Manager-Klassen Sie mit etc arbeiten ..
Lösung 2 - (Ihre Aufgabe könnte ohne Generics gelöst werden)
Sie sagten, dass Sie nicht die empfangenen Instanzen werfen wollen. Da Sie für diese Instanzen unterschiedliche Methoden aufrufen möchten, rufen Sie diese auf, indem Sie verschiedene Methoden für Ihre Hilfsklasse aufrufen. In diesem Fall brauchen Sie Generics nicht wirklich.
Dies würde die Arbeit tun, ohne IBaseService
oder sogar Generics zu verwenden.
public class createGenericClass
{
public void CallDoSomeThing(IWebService t, int x, int y)
{
t.DoSomeThing(x, y);
}
public void CallDoSomeThingElse(IVoiceService t, int a, float b)
{
t.DoSomeThingElse(a, b);
}
}
Lösung 3-(Die Doppelallgemein Sachen, die hier nicht empfohlen)
Da Sie haben es heraufbeschworen:
public class createGenericClass<T, V>
where T: IWebService
where V: IVoiceService
{
public void CallDoSomeThing(T t, int x, int y)
{
t.DoSomeThing(x, y);
}
public void CallDoSomeThingElse(V t, int a, float b)
{
t.DoSomeThingElse(a, b);
}
}
Verbrauch:
static void Main(string[] args)
{
var obj = new createGenericClass<IWebService, IVoiceService>();
obj.CallDoSomeThing(new Web_Service(), 1, 2);
obj.CallDoSomeThingElse(new Voice_Service(), 3, 4);
}
" nicht fähig ", können Sie uns sagen, was passiert? Wenn der Compiler sich beschwert, müssen Sie uns den tatsächlichen Compilerfehler mitteilen. –