Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 引用继承的类';s<;T>;派生类中的类型_C#_Class_Derived - Fatal编程技术网

C# 引用继承的类';s<;T>;派生类中的类型

C# 引用继承的类';s<;T>;派生类中的类型,c#,class,derived,C#,Class,Derived,我不知道这是否可能,但这是我需要的。 我正在玩弄一些东西,想知道这是否可能,因为您无法基于密封类型(如int、Int32、Int64等)创建自己的数据类型 我想创建一个顶级类,它是用一些常用的东西定义的给定类型。然后,将其派生为两个子类,但在本例中,每个类都基于and int或Int64类型。从该实例创建其中一个的实例,并了解其参数referec/return设置的类型化基础 因此,当我需要创建“ThisClass”的实例时,我不必知道它的类型基础是int或Int64,但它将知道类型,并且能够允

我不知道这是否可能,但这是我需要的。 我正在玩弄一些东西,想知道这是否可能,因为您无法基于密封类型(如int、Int32、Int64等)创建自己的数据类型

我想创建一个顶级类,它是用一些常用的东西定义的给定类型。然后,将其派生为两个子类,但在本例中,每个类都基于and int或Int64类型。从该实例创建其中一个的实例,并了解其参数referec/return设置的类型化基础

因此,当我需要创建“ThisClass”的实例时,我不必知道它的类型基础是int或Int64,但它将知道类型,并且能够允许使用类型化的。。。这样,如果我想将我的ThisClass定义从子级别1更改为子级别2,我就不必绕着所有不同的数据类型定义转了

希望这有意义

public class TopLevel<T>
{
    ... 
}

public class SubLevel1 : TopLevel<int>
{
    ...
}

public class SubLevel2 : TopLevel<Int64>
{ 
    ...
}

public class ThisClass : SubLevel1
{
    ...
    public <based on the Int data type from SubLevel1> SomeFunc()
    {  
        return <the Int value computed>;
    }
}
公共类顶级
{
... 
}
公共类子级别1:顶级
{
...
}
公共类子级别2:顶级
{ 
...
}
公共类此类:子级1
{
...
公共SomeFunc()
{  
返回;
}
}

如果不将所有派生类参数化,则无法在编译时执行此操作:

public class ThisClass<T> : SubLevel1<T> etc etc
公共类此类:次级1等

您可以通过检查
typeof(ThisClass)在运行时通过反射来完成.BaseType
等。但这可能会变得相当混乱,因为您需要编写理解整个基类主干的继承和泛型类型参数层次结构的代码。

我假设SomeFunc应该存在于
TopLevel
的所有子类中,因此您应该在那里定义它:

public abstract class TopLevel<T>
{
    public TopLevel()
    {
    }

    public abstract T SomeFunc();
}
公共抽象类顶级
{
公共顶级()
{
}
公共摘要T SomeFunc();
}
特定的子类将知道泛型类型参数,因此该类将SomeFunc定义为:

public class ThisClass : SubLevel1
{ ...
   public override int SomeFunc()
   {  
      return <the Int value computed>;
   }
}
公共类此类:子级1
{ ...
公共重写int-SomeFunc()
{  
返回;
}
}

您不能按要求执行此操作


但是,您可以使用MyType=System.Int32编写
在文件顶部,然后在文件中的所有位置使用
MyType
。这将允许您轻松地更改类型。

这是我们的期望,但不一定要将其中的一些内容填写到抽象级别,但可以。。。谢谢