我正在尝试设计一个足够灵活的类来绘制有关不同类型数据的数据。我是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; }
}
这可能吗?如果是这样,我该怎么做?提前谢谢!
答案 0 :(得分:1)
你可以做一些。
首先,对输出进行泛化:只需在类中添加另一个类型参数。
public class DataChart<T, U>
{
public Func<T, U> RowLabel { get; set; }
}
但是你提到的那些类型限制没有意义。类型约束是“和”-ed,而不是“或”-ed。 string
不是struct
,因此您无法将其限制为特定的类型组合。如果你不受约束,它仍然可以工作,尽管你会失去一些编译时的安全性。
编辑:此外,无论如何,事实证明你无法将string
指定为类型参数。这是一个密封的课程!拥有只接受密封类类型的泛型将是毫无意义的,编译器会阻止它。