C# Generic T Class TypeOf,这可能吗?

标签 c# generics type-conversion gettype

我有一个通用类。 Class<T>根据调用代码中的 switch 语句,它可以是 class<int> class<string> class<decimal>

返回 this 的方法将其作为对象返回,因为调用代码在设置它之前并不知道它是什么。

一旦我从函数中获取对象,有没有办法做到这一点?

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;
    }

这是类模型的布局,以防有帮助。

enter image description here

image of layout

谢谢。

最佳答案

如果您在解析实例“x”后要对其调用相同的操作,您可能会考虑使用接口(interface),这将允许您定义对象执行的方法(和属性),而无需定义其类型。

你的代码可能最终看起来像这样

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();
}

关于C# Generic T Class TypeOf,这可能吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5683920/

相关文章:

C# ??属性(property)运营商,它是如何运作的?

C# 列表属性

c# - 不能继承泛型

c# - "Recasting"接口(interface)的子类实例(声明为基类) - 为什么它有效?

当仅存在小数部分时,Oracle TO_NUMBER 转换失败

c# - 如何检查谁在 C# 中使用某个端口?

c# - 从函数中调用 Akka.Net Actor 并返回 Acknowledgment

c# - 具有相同基类的泛型的泛型列表

java - java中参数化类可以扩展自身吗?

c++ - 如何将 4 个 UINT8 变量连接成一个 UINT32 变量?