C#通用T类TypeOf,这可能吗?

| 我有一个通用的类。
Class<T>
,取决于调用代码中的switch语句,它可以是
class<int>
class<string>
class<decimal>
返回此方法的方法将其作为对象返回,因为调用代码在设置之后才知道它是什么。 一旦我从函数取回对象,有没有办法做到这一点?
load(object result)
{
    Type t = result.GetType().GetGenericArguments()[0];

    Class<t> x = (Class<t>) result;
}
还是我必须设置一张支票以检查每种类型。如果是
int
,然后是
Class<int>
,依此类推... 编辑: 这是我想要做的实际代码:
public class ReportResult<TP>
{
    public ReportResult()
    {
        ReportHeaders = new List<ReportHeader>();
        ReportViews = new List<IDataAttributeChild<TP>>();
    }

    public List<ReportHeader> ReportHeaders {get;set;}
    public List<IDataAttributeChild<TP>> ReportViews {get;set;}         
}
巴尔
    public object GetReportData(ReportProcedureNameEventArg procedureNameEventArg)
    {
        object result = null;

        switch (procedureNameEventArg.SelectedNode.Class)
        {
            case ReportClass.Count:
                var r = new ReportResult<int>
                            {
                                ReportViews = GetCountByReport(procedureNameEventArg),
                                ReportHeaders = GetReportHeaders(procedureNameEventArg.SelectedNode.ReportViewId)
                            };

                result = r;
                break;
            case ReportClass.List:
                break;
            case ReportClass.Date:
                 var r = new ReportResult<datetime>
                            {
                                ReportViews = GetDateSummaryReport(procedureNameEventArg),
                                ReportHeaders = GetReportHeaders(procedureNameEventArg.SelectedNode.ReportViewId)
                            };

                result = r;
                break;
            default:
                throw new ArgumentOutOfRangeException();
        }
        return result;
    }
图形用户界面
    public void LoadTreeResult(object result)
    {
        Type t = result.GetType().GetGenericArguments()[0];

        ReportResult<?> fff = (ReportResult<?>)result;


        dgResult.Columns.Clear();

        foreach (var header in result.ReportHeaders)
        {
            dgResult.Columns.Add(
                    new DataGridTextColumn
                    {
                        Header = header.Header,
                        Binding = new Binding(header.Binding)
                    });
        }

        // This would also be a switch depending on a property coming 
        // back to now what class to cast to in order to populate the grid.
        List<ReportCountByView> d = new List<ReportCountByView>();

        foreach (var reportCountByView in result.ReportViews)
        {
            d.Add((ReportCountByView)reportCountByView);
        } 

        dgResult.ItemsSource = d;
    }
如果可能的话,这是类模型的布局。 布局图 谢谢。     
已邀请:
如果要在解决实例“ x”上调用相同的操作后,可以考虑使用接口,则可以在不定义对象的情况下定义对象执行的方法(和属性)。类型。 您的代码可能最终看起来像这样
public interface IMyInterface
{
  void PerformOperation();
}

public class MyGeneric<T> : IMyInterface
{
  T Value {get;set;}
  MyGeneric(T val) 
  {
    Value = val;
  }

  void PerformOperation 
  { 
     Console.WriteLine(\"T is {0}\", typeof(T));
     Console.WriteLine(\"Value is {0}\", Value);
  }
}

public void main(string[] args)
{
   IMyInterface inst = null;
   switch (args[0])
   {
    case \"string\":
       inst = new MyGeneric(\"hello\");
       break;
    case \"int\":
        inst = new MyGeneric(7);
        break;
    case \"decimal\"
        inst = new MyGeneric(18.9M);
        break;
    }

   inst.PerformOperation();
}
    
您以后想对x做什么?另外,如果可以构造它,使x始终是某个基类的实例,则可以将其强制转换为基类。     
这取决于您以后打算如何使用泛型类型。
string
int
decimal
除了
object
外没有其他共同的基本类型,但是它们确实共享一些接口,因此如果以后要对其进行排序,则可以选择类似like15ѭ的东西。或者,如果要使用多个接口,则可以声明通用约束:
Class<T> where T : IEquatable<T>, IComparable<T>, IFormattable // and so on...
但是看起来您要的东西似乎不可能。泛型的整个前提是在设计时设置类型。     
我的想法 如果始终使用结果来调用类的相同成员,则可以创建一个接口并将其实现到不同的类,并将结果作为接口。 这样,您将能够使用不同的类,但可以使用在这些类中实现的某些接口相同成员     
我认为进行此切换的最佳方法是针对不同类型实际实现单独的方法,然后在UI层进行切换。 例如
public ReportResult<int> GetReportDataCount(ReportProcedureNameEventArg procedureNameEventArg)
public ReportResult<DateTime> GetReportDataDate(ReportProcedureNameEventArg procedureNameEventArg)
public void GetReportDataList(ReportProcedureNameEventArg procedureNameEventArg)
\“ List \”是真正使我失望的一个,因为它返回null,否则我会说做类似的事情
public ReportResult<T> GetReportData<T>(ReportProcedureNameEventArg procedureNameEventArg) where T:struct
(然后以编程方式强制执行类型)。 如果您想通过动力学来尝试它,我想您可以通过使用ReportResult进行鸭子输入来使它基本上那样工作,但是在混合使用List模式时也可能会变得混乱。     

要回复问题请先登录注册