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

しかし、あなたが言及した型の制約は意味がありません。型制約は、「or」ではなく「and」です。Astringは ではないためstruct、特定の型の組み合わせに限定することはできません。コンパイル時の安全性はいくらか失われますが、制約を付けないままにしておくと機能します。

string編集:また、とにかく、型パラメーターとして指定できないことが判明しました。密閉型クラスです!シールされたクラスの型のみを受け入れるジェネリックを持つことは無意味であり、コンパイラはそれを防ぎます。

于 2012-07-27T20:17:53.700 に答える