0

申し訳ありませんが、私が何をしようとしているのかを言葉で説明することはできませんが..

私がシナリオを持っているとしましょう。

public class TestClass
{
}

public class TestClass1 : TestClass, TestInterface<ValueClass1>
{
    public ValueClass1 Property { get; set; }
}

public class TestClass2 : TestClass, TestInterface<ValueClass2>
{
    public ValueClass2 Property { get; set; }
}

public interface TestInterface<T> where T : ValueClass
{
    T Property { get; set; }
}

public class ValueClass
{
    public int Id { get; set; }
}

public class ValueClass2 : ValueClass
{
}

と(およびそれ以上) の両方を含むPropertyリストから値を取得する必要がありますが、リストをループして値を設定する方法がわかりません。List<TestClass>TestClass1TestClass2Property

ここに基本的に私がやろうとしていることがあります

List<TestClass> list = new List<TestClass>();

foreach (var item in list.OfType<????>())
{
    item.Property = PropertyManager.GetProperty(item.Property.Id);
}

編集:

共通のプロパティを持つ多くのクラスがありますが、 (シリアライゼーションなどの他の要因により)Typeそのプロパティの実際のものが必要であり、メインの基本クラスのリストをループしてプロパティにアクセスできる必要があります。 base Type.

上記の例のように、Idから値を取得するだけで済みますProperty

現在、各クラスには独自のクラスがあり、必要なことを行うためPropertyに使用Reflectionしています。よりクリーンなソリューションを探していました。

編集:

これは私の現在の実装です

public class TestClass
{
}

public class TestClass1 : TestClass
{
    public ValueClass Property { get; set; }
}

public class TestClass2 : TestClass
{
    public ValueClass2 Property { get; set; }
}

public class ValueClass
{
    public int Id { get; set; }
}

public class ValueClass2 : ValueClass
{
}

値を設定するには、リフレクションを使用する必要があります

List<TestClass> list = new List<TestClass>();

foreach (var item in list.Where(x => x.GetType().GetProperty("Property") != null))
{
    var property = item.GetType().GetProperty("Property");
    property.SetValue(PropertyManager.GetProperty((property.GetValue(item) as ValueClass).Id));
}

そして、これPropertyManagerはただDictionaryValueClassタイプです

public static ValueClass GetProperty(int id)
{
    if (_properties.Containskey(id))
    {
       return _properties[id];
    }
    return null;
}

だから私が必要としているのは、「TestClass」のリストをループして、ValueClass Property.

現時点ではReflection、私の唯一の現実的なオプションと考えています。

4

3 に答える 3

2

これらのクラスの関係はごちゃごちゃしており、これらの継承とパラメーターの関係に満足できないことは保証します。あなたがやろうとしていることを詳しく説明できますか?

とにかく、次の方法でPropertyIdにアクセスできます。

 static void Main(string[] args)
    {
        List<TestClass> list = new List<TestClass>();

        foreach (TestClass item in list)
        {
            ValueClass x = item.Property;
            int y = item.Property.Id;
        }
    }

このようなシナリオでは、変数の型を知るために、最初は var を避けるのがよい場合がよくあります。

編集
迅速であまり汚れていないソリューションは、dynamicを使用しています。

dynamic d = o; // assign the items in your list to a dynamic variable
var somevar = d.Property;    // access any property you expect x to have.

編集 きれいな解決策は次のとおり
です。
2. インターフェイスを実装する型にインターフェイスをアタッチします。

于 2013-03-19T08:46:42.430 に答える
0

あなたが試すことができます:

public class TestClass
{
    public virtual ValueClass Property { get; set; }
}

public class TestClass1 : TestClass
{
    private ValueClass property = null;
    public override ValueClass Property
    {
        get
        {
            return property;
        }
        set
        {
            property = (ValueClass)value;
        }
    }
}

public class TestClass2 : TestClass
{
    private ValueClass2 property = null;
    public override ValueClass Property
    {
        get
        {
            return property;
        }
        set
        {
            property = (ValueClass2)value;
        }
    }
}

public class ValueClass
{
    public int Id { get; set; }
}

public class ValueClass2 : ValueClass
{
}

と:

foreach (var item in list)
        {
            item.Property = PropertyManager.GetProperty(item);
        }
于 2013-03-19T11:03:31.890 に答える
0
public interface IHasProperty {
   ValueClass PropertyAsValueClass { get;set; }
}

public class TestClass<T> : IHasProperty where T : ValueClass
{
   public T Property {get;set;}

   public ValueClass PropertyAsValueClass {
     get { return this.Property; }
     set { this.Property = value as T; }
   }
}

public class TestClass1 : TestClass<ValueClass>
{
}

public class TestClass2 : TestClass<ValueClass2>
{
}

public class ValueClass
{
    public int Id { get; set; }
}

public class ValueClass2 : ValueClass
{
}

必要に応じて追加のチェックを入れることもできます...

その後

var list = new List<IHasProperty>();
foreach (var item in list)
{
    item.PropertyAsValueClass = PropertyManager.GetProperty(item.PropertyAsValueClass.Id);
}
于 2013-03-19T11:31:44.657 に答える