1

内部に同じプロパティを持つさまざまなタイプのオブジェクトを参照渡しし、インターフェイスなしでそれらを設定する方法。

私のアプリには、共通のプロパティを持つまったく異なるタイプがあります。このプロパティが double 配列であるとしましょう。

double[] samples;

次に、これらのサンプルを 20 個のオブジェクトに入力する必要があります。このオブジェクトのクラス定義へのアクセス権がないため、インターフェイスを作成したり、基本クラスから継承したりすることはできません。

私が呼び出す 1 つのメソッドと、このメソッドを使用してすべてのプロパティを設定するにはどうすればよいでしょうか。

私はこのような方法を1つ持ちたいです:

private static void FillSamples(ref WhoKnowsWhat dataType, MyObject theSamples)
{

for (int i = 0; i < sampleCount; i++)
                        {
                            dataType.SampleLength[i] = MyObject.X[i];
                            dataType.SampleValue[i]  = MyObject.y[i];
                        }
}

そして、これをまったく異なるタイプで呼び出します。

FillSamples(ref BigStruct.OneTypeMine, theSamples);
FillSamples(ref BigStruct.AnotherTypeMine, theSamples);
FillSamples(ref BigStruct.HisType12345, theSamples);

次に、大きな構造体には、これらのサンプルが最後に入力されている必要があります。

C#に方法はありますか?

ありがとう!

4

3 に答える 3

4

dynamicキーワードを使用できます。

private static void FillSamples(dynamic dataType, MyObject theSamples)
{
    for (int i = 0; i < sampleCount; i++)
    {
        dataType.SampleLength[i] = MyObject.X[i];
        dataType.SampleValue[i]  = MyObject.y[i];
    }
}

編集:

リフレクションの使用 (.Net 4.0 以降を使用しない場合):

private static void FillSamples(object dataType, MyObject theSamples)
{
    Type t = dataType.GetType();
    var px = t.GetProperty("SampleLength");
    var py = t.GetProperty("SampleValue");

    for (int i = 0; i < sampleCount; i++)
    {
        px.SetValue(dataType, MyObject.X[i], null);
        py.SetValue(dataType, MyObject.Y[i], null);
    }
}
于 2012-08-15T12:50:32.190 に答える
1

動的オブジェクトを使用できます。コンパイル時にチェックできないため、動的オブジェクトのフィールドをターゲットにする場合は注意が必要です。以下の私の例を参照してください。

[TestFixture]
public class DynamicObjects
{
    [Test]
    public void Dynamic_Call()
    {
        dynamic obj1 = new Apple();
        obj1.Weight = 100;
        obj1.Color = "Red";

        dynamic obj2 = new Orange();
        obj2.Weight = 200;
        obj2.Width = 10;

        Assert.IsTrue(obj1.Weight < obj2.Weight);
    }
}

public class Apple
{
    public int Weight { get; set; }
    public string Color { get; set; }
}

public class Orange
{
    public int Weight { get; set; }
    public int Width { get; set; }
}
于 2012-08-15T12:56:20.917 に答える
1

役立つかどうかはわかりませんが、リフレクションを使用して、実行時にオブジェクトがサポートするプロパティ (およびフィールド、メソッドなど) を見つけることができます。詳しく知りたい場合は、たとえばhttp://www.csharp-examples.net/reflection-property-names/をご覧ください。

于 2012-08-15T12:54:17.090 に答える