在调用方法时将泛型类型强制转换为接口

本文关键字:转换 接口 泛型类型 调用 方法 | 更新日期: 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"); } }
}