2016-03-25 4 views
0

私はクラスを持っています。C#ジェネリック型が文字列で属性を持ち、それに割り当てられているかどうかを確認します。

class A 
{ 
    string X {get; set;} 
    string Y {get; set;} 
} 

と(私の場合Aで)ジェネリッククラスは文字列で指定された引数を持ち、そうであれば、それに値を割り当てる場合、私は、お願いしたいと思いますいくつかの方法で、

class CreateGenerics<T> where T:new() 
{ 
    public List<T> create(string attr, string[] attrValues) 
    { 
    //I want to check if T has attribute attr (let's say "X") 

    List<T> ret = new List<T>(); 
    foreach(string value in attrValues) { 
     T t = new T(); 
     //set 'attr' attribute of T to value of 'value' 
     ret.Add(t); 
    } 
    return ret; 
    } 
} 
+2

あなたはプロパティまたは[属性]を意味しますか? –

+0

@Vlado彼はあなたが "属性"の意味を明確にしようとしています。あなたが書いたコードでは、どこにも属性はありません。あなたが本当にプロパティを探したいと思っているようです。 C#では、属性とプロパティは全く異なる2つのものです。 – Kyle

答えて

1

まず、属性ではなくプロパティについて説明します。あなたは既に試したとしてあなたはプロパティ名XがクラスAに存在する場合、この場合、私がチェックしています例えば、それを反射し、ジェネリックを使用することができます

public static List<T> Create<T>(string attr, string[] attrValues) where T: new() 
{ 
    //I want to check if T has attribute attr (let's say "X") 

    List<T> ret = new List<T>(); 
    foreach (string value in attrValues) 
    { 
     T t = new T(); 

     foreach (var property in typeof(T).GetProperties()) 
     { 
     if (property.Name == attr) // setting value for x 
     { 
      property.SetValue(t, value); 
     } 
     } 
     ret.Add(t); 
    } 
    return ret; 
} 

が好き、それを呼び出すことができます。

あなたのクラスを示したよう
var result = Create<A>("X",new string[]{"attrValues"}); 

と仮定すると、すべてのプロパティは、文字列

1

あなたは、私が作成した例 のために、このような何かを行うことができますmyClassExtensionsというクラスです。どんなクラスオブジェクトもクラスに渡すことができ、プロパティを繰り返します。クラスを初期化したプロパティをnullからstring.Emptyに変更したい場合は、静的クラスを使用して拡張メソッドを作成します。これは非常に単純です。

public class ClassA 
{ 
    string X {get; set;} 
    string Y {get; set;} 
} 

public static class myClassExtensions 
{ 
    public static void ConvertNullToStringEmpty<T>(this T clsObject) where T : class 
    { 
     PropertyInfo[] properties = clsObject.GetType().GetProperties();//typeof(T).GetProperties(); 
     foreach (var info in properties) 
     { 
      // if a string and null, set to String.Empty 
      if (info.PropertyType == typeof(string) && info.GetValue(clsObject, null) == null) 
      { 
       info.SetValue(clsObject, String.Empty, null); 
       // or set some boolean etc since you know the property at this point is of type string 
      } 
     } 
    } 
} 

のでIIは、私はこれが削除された私のためにこれを解く男X and Y = string.Empty

-1

の値を確認します。この

ClassA classaVar = null; 
classaVar = (ClassA)FormatterServices.GetUninitializedObject(typeof(ClassA)); 
myClassExtensions.ConvertNullToStringEmpty<ClassA>(classaVar); 

ような何かをするだろうあなたの例ではClassAというクラスIを持っています彼のポスト(私はそれが偶然にそれをした私ではなかった願っています)

There is fiddle with solution

using System; 
using System.Collections.Generic; 

class A { 
    public string X {get; set;} 
    public string Y {get; set;} 
    public override string ToString() { 
     return "X: " + this.X + " Y: " + this.Y; 
    } 
} 

public class Program 
{ 
    public static void Main() 
    { 
     List<A> list = Create<A>("X", new string[] {"value1", "value2"}); 
     foreach(A item in list) { 
      Console.WriteLine(item.ToString()); 
     } 
     list = Create<A>("Y", new string[] {"valueY1", "valueT2"}); 
     foreach(A item in list) { 
      Console.WriteLine(item.ToString()); 
     } 
    } 
    public static List<T> Create<T>(string attr, string[] attrValues) where T: new() 
    { 
     //I want to check if T has attribute attr (let's say "X") 

     List<T> ret = new List<T>(); 
     foreach (string value in attrValues) 
     { 
      T t = new T(); 


      foreach (var property in typeof(T).GetProperties()) 
      { 
       if (property.Name == attr) // setting value for x 
       { 
        property.SetValue(t, "Value"); 
       } 
      } 
      ret.Add(t); 
     } 
     return ret; 
    } 
} 

ありがとうございました。

+0

ようこそ、あなたはこのような答えを投稿するべきではありません、あなたがしたい場合は、フィドルへのリンクではなく、ポストのコードを表示する –

関連する問題