2011-10-15 7 views
1

インポートされたファイルがあります。基本的には、このファイルのヘッダーを使用して、クラスのどの変数にどの列を配置するかを知りたいと考えています。私はC#で変数の属性を使ってこの比較をしたいと思いますが、これにアプローチしてこれを設定する方法はわかりません。属性を照合してクラスを入力する

たとえば、私のクラスの変数の1つがpublic string Name;で、インポートされたファイルでは、列ヘッダーの1つがNameです。私はむしろ変数を直接一致させるためにリフレクションを使用しません。クラス変数に属性を設定し、それを使ってこれらのローカルのstringヘッダー変数と一致させ、正しい値を入力できますか?

+2

あなたのクラスのメンバーの属性をルックアップできなかったか、何かを誤解しましたか? – DeCaf

+0

まあ、私は、正確な変数名を探すためにリフレクションを使用するのではなく、属性名を探して、どの変数がマップされているかを確認することを意味していると思います。それは理にかなっていますか? – slandau

+0

それは確かにもっと意味があります。 :) – DeCaf

答えて

4

ここでは、必要なものを提供するプログラムの例を示します。 SetOptionメソッドは、指定されたオプション名を持つフィールドを検索し、値を設定するリフレクションロジックを提供するものです。

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Reflection; 

namespace ConsoleApplication1 
{ 
    // This is the attribute that we will apply to the fields 
    // for which we want to specify an option name. 
    [AttributeUsage(AttributeTargets.Field)] 
    public class OptionNameAttribute : Attribute 
    { 
     public OptionNameAttribute(string optionName) 
     { 
     OptionName = optionName; 
     } 

     public string OptionName { get; private set; } 
    } 

    // This is the class which will contain the option values that 
    // we read from the file. 
    public class OptionContainer 
    { 
     [OptionName("Name")] 
     public string MyNameField; 

     [OptionName("Value")] 
     public string MyValueField; 
    } 

    class Program 
    { 
     // SetOption is the method that assigns the value provided to the 
     // field of the specified instance with an OptionName attribute containing 
     // the specified optionName. 
     static void SetOption(object instance, string optionName, string optionValue) 
     { 
     // Get all the fields that has the OptionNameAttribute defined 
     IEnumerable<FieldInfo> optionFields = instance.GetType() 
      .GetFields() 
      .Where(field => field.IsDefined(typeof(OptionNameAttribute), true)); 

     // Find the single field where the OptionNameAttribute.OptionName property 
     // matches the provided optionName argument. 
     FieldInfo optionField = optionFields.SingleOrDefault(field => 
      field.GetCustomAttributes(typeof(OptionNameAttribute), true) 
      .Cast<OptionNameAttribute>().Single().OptionName.Equals(optionName)); 

     // If the found field is null there is no such option. 
     if (optionField == null) 
      throw new ArgumentException(String.Format("Unknown option {0}", optionName), "optionname"); 

     // Finally set the value. 
     optionField.SetValue(instance, optionValue); 
     } 

     static void Main(string[] args) 
     { 
     OptionContainer instance = new OptionContainer(); 
     SetOption(instance, "Name", "This is the value of Name"); 
     SetOption(instance, "Value", "This is my value"); 

     Console.WriteLine(instance.MyNameField); 
     Console.WriteLine(instance.MyValueField); 
     } 
    } 
} 
+0

おかげで男!これはいい。 – slandau