1

我正在尝试设计一个足够灵活的类来绘制关于不同类型数据的数据图表。我是 C# 中的 OOP 新手,所以我正在摸索尝试使用泛型、委托和类的某种组合来实现这一目标。

这是我到目前为止写的课程:

using System;
using System.Collections.Generic;

namespace Charting
{
    public class DataChart<T>
    {
        public Func<T, object> RowLabel { get; set; }
    }
}

这就是我试图称呼它的方式:

var model = new DataChart<MyClass>()
{
    RowLabel = delegate(MyClass row)
    {
        return String.Format("{0}-hello-{1}", row.SomeColumn, row.AnotherColumn);
    }
};

这种方法的问题是我必须明确地转换 RowLabel发出的对象。我希望我能以某种方式使输出类型成为通用类型并为其添加约束,如下所示:

    public class DataChart<T>
    {
        // The output of the RowLabel method can only be a value type (e.g. int, decimal, float) or string.
        public Func<T, U> RowLabel where U : struct, string { get; set; }
    }

这可能吗?如果是这样,我该怎么做?提前致谢!

4

1 回答 1

1

你可以做一些

首先,泛化输出:只需向类添加另一个类型参数。

public class DataChart<T, U>
{
  public Func<T, U> RowLabel  { get; set; }
}

但是你提到的那些类型约束没有意义。类型约束是“and”-ed,而不是“or”-ed。Astring不是 a struct,因此您不能将其限制为特定的类型组合。如果你让它不受约束,它仍然可以工作,尽管你失去了一些编译时安全性。

编辑:另外,事实证明你不能指定string为类型参数,无论如何。是密封类!拥有一个只接受密封类类型的泛型是没有意义的,编译器会阻止它。

于 2012-07-27T20:17:53.700 回答