2014-01-08 7 views
0

在方法中,如果參數名稱與對象屬性名稱完全匹配,是否可以「自動分配」值?如果對象屬性名稱等同,「自動分配」參數值?

作爲一個例子,假設有以下方法,即用的類型myexample中

public static void Foo (string String1, string String2) 
{ 

//rather than doing declarative assignment 
MyExample example = new MyExample(); 
MyExample.String1 = String1; 

// Some magic method, Reflection maybe? 
MyExample example = SomeMethodThatLooksAtParametersAndAssigns(); 

} 

本質上,在上述的參數名,字符串1,準確的屬性名稱匹配MyExample對象。而不是一個一個地分配它們,有沒有辦法讓這個自動化?我正在尋找從另一種方法調用Foo方法,查看調用者參數,然後進行分配。所以Foo或多或少是一種實用方法,並且與任何特定類型無關。

更復雜的是,是否有可能以通用的方式對每個對象/類型都做同樣的事情?

+0

是的,你可以用反射來做到這一點。使用字符串名稱檢索屬性,並將其值設置爲您希望的值。看看'someObject.GetType()。GetProperty(string1);'。 –

+0

代碼示例??? – user3010406

+0

謝謝,但這是一個參考硬編碼。你將如何傳遞調用方法來查看參數? – user3010406

回答

0

我的第一個解決辦法是隻創建這樣的事情:

public static void Foo (string string1, string string2) { 
    MyExample example = new MyExample(); 
    var prop = example.GetType().GetProperty(string1, BindingFlags.Public | BindingFlags.Instance); 

    if(prop != null && prop.CanWrite) { 
     prop.SetValue(example, string1, null); 
    } 
} 

這種方法將創建類型MyExample的新實例,獲取相應的屬性,並與相應的值調用它。

,或者如果你真的想使這個更通用:

void Main() 
{ 
    Foo("x", "y"); 
} 

public static void Foo (string string1, string string2) { 
    var type = Assembly.GetExecutingAssembly().GetTypes().FirstOrDefault(x => x.GetProperties().FirstOrDefault(y => y.Name == string1) != null); 
    var obj = Activator.CreateInstance(type); 
    var prop = type.GetProperty(string1, BindingFlags.Public | BindingFlags.Instance); 
    if(prop != null && prop.CanWrite) { 
     prop.SetValue(obj, string2, null); 
    } 

    Console.WriteLine ((obj as Test).x); 
} 

class Test { 
    public String x {get; set; } 
} 

輸出:

Ÿ

這確實和以前一樣,也是動態創建一個新的找到的類型的實例,同時在整個程序集中搜索它。

+0

謝謝。但是這仍然在通用解決方案中具有硬編碼的MyExample類型。我正在尋找從另一種方法調用Foo方法,查看調用者參數,然後進行分配。 – user3010406

+0

@ user3010406:這是一個不應該在那裏的殘餘物。再看一遍,我相信它現在就是你想要的。 –

+0

你將如何傳遞調用方法作爲從何處詢問類型的參數? – user3010406

相關問題