在调用方法时将泛型类型强制转换为接口
本文关键字:转换 接口 泛型类型 调用 方法 | 更新日期: 2023-09-27 18:23:46
是否可以在new ConsumeA1<T> ();
到A1
行中强制转换T
使用当前代码,我得到错误:
类型"T"不能用作泛型类型或方法"ConsumerA1"中的参数"T"。没有从"T"到"A1"的装箱转换或类型参数转换
class Consume<T> where T : A
{
public Consume()
{
if (typeof(T) == typeof(A1))
{
new ConsumeA1<T> ();
}
if (typeof(T) == typeof(A))
{
new ConsumeA<T>();
}
}
}
class ConsumeA<T> where T : A
{
}
class ConsumeA1<T> where T : A1
{
}
interface A
{
}
interface A1 : A
{
}
class Imp1 : A
{
}
class Imp2 : A1
{
}
// ....
class ImpN : A
{
}
如果您想强制转换为具体类型,那么使用泛型是没有意义的
据我所知,您所有的具体类型都包含Consume()功能
您可以将此方法移动为A接口的一部分
然后,您不需要Consume<T> 类
您可以使用一个方法,该方法接受a作为参数并调用Consume()
using System;
namespace ConsoleApplication3
{
class Program
{
static void Main(string[] args)
{
A obj = new Imp1();
Consume(obj);
obj = new Imp2();
Consume(obj);
obj = new ImpN();
Consume(obj);
Console.ReadLine();
}
static void Consume(A a) { a.Consume(); }
}
interface A { void Consume(); }
interface A1 : A { }
class Imp1 : A { public void Consume(){ Console.WriteLine("Imp1"); } }
class Imp2 : A1 { public void Consume(){ Console.WriteLine("Imp2"); } }
class ImpN : A { public void Consume(){ Console.WriteLine("ImpN"); } }
}
现在,如果您需要与示例代码类似的东西,您可以使用通用约束
using System;
namespace ConsoleApplication3
{
class Program
{
static void Main(string[] args)
{
Consume<Imp1>.ConsumeObject();
Consume<Imp2>.ConsumeObject();
Consume<ImpN>.ConsumeObject();
Console.ReadLine();
}
}
class Consume<T> where T : A, new()
{
static public void ConsumeObject()
{
new T();
}
}
class ConsumeA<T> where T : A { }
class ConsumeA1<T> where T : A1 { }
interface A { }
interface A1 : A { }
class Imp1 : A { public Imp1() { Console.WriteLine("Imp1"); } }
class Imp2 : A1 { public Imp2() { Console.WriteLine("Imp2"); } }
class ImpN : A { public ImpN() { Console.WriteLine("ImpN"); } }
}
或者更少的代码行
namespace ConsoleApplication3
{
class Program
{
static void Main(string[] args)
{
new Consume<Imp1>();
new Consume<Imp2>();
new Consume<ImpN>();
}
}
class Consume<T> where T : A, new() { public Consume() { new T(); } }
interface A { }
interface A1 : A { }
class Imp1 : A { public Imp1() { System.Console.WriteLine("Imp1"); } }
class Imp2 : A1 { public Imp2() { System.Console.WriteLine("Imp2"); } }
class ImpN : A { public ImpN() { System.Console.WriteLine("ImpN"); } }
}
或者不具有Consume<T>类
namespace ConsoleApplication3
{
class Program
{
static void Main(string[] args)
{
Consume<Imp1>();
Consume<Imp2>();
Consume<ImpN>();
System.Console.ReadLine();
}
private static void Consume<T>() where T : A, new() { new T(); }
}
interface A { }
interface A1 : A { }
class Imp1 : A { public Imp1() { System.Console.WriteLine("Imp1"); } }
class Imp2 : A1 { public Imp2() { System.Console.WriteLine("Imp2"); } }
class ImpN : A { public ImpN() { System.Console.WriteLine("ImpN"); } }
}