2010-10-24 70 views
6

我想創建一個匿名類型內的函數,當匿名類型屬性是函數參數。從反射創建一個匿名類型ParamInfo []

例如,對於函數: private bool CreatePerson(string FirstName,string LasName,int Age,int height);

我將有一個匿名類型的屬性:名字,LasName,年齡和身高。 並且函數參數的值將是匿名類型屬性的值。

private bool CreatePerson(string FirstName, string LasName, int Age, int height) 
    { 
     // Get this method parameters 
     MethodBase currentMethod = MethodBase.GetCurrentMethod(); 
     ParameterInfo[] parametersInfo = currentMethod.GetParameters(); 

     // create an object of the parameters from the function. 
     foreach (ParameterInfo paramInfo in parametersInfo) 
     { 
      // add a property with the name of the parameter to an anonymous object and insert its value to the property. 
      // WHAT DO I DO HERE? 
      .... 
     } 

     return true; 
    } 
+0

你想創建一個具有已知字段名稱和類型的匿名類型,爲什麼你需要反射?新{FirstName = FirstName,...}會很好嗎? – SoftMemes 2010-10-24 13:06:16

+0

他希望在運行時定義 - 我相信。 – Aliostad 2010-10-24 13:10:03

+0

@Aliostad - 但描述只是說_values_應該來自參數,參數/屬性的名稱已經存在... – SoftMemes 2010-10-24 13:12:01

回答

2

如果我理解正確並且想在運行時定義屬性,這是不可能的。雖然在匿名類型中,您可能能夠創建在那裏定義的類型,然後通過分配值,但必須知道屬性的名稱,編譯時間爲,編號爲

其實,類型是匿名的,但不是CLR。如果您在ildasm.exe或反射器中查看程序集,則會看到這些匿名類型的名稱中始終有<>

C#的動態或許能在這裏幫助,但據我所知,他們與幫助對象是我們沒有類型信息溝通,沒有創造 - 但也有可能是一種方式,我做的不知道。

+0

儘管可以在運行時使用Reflection.Emit生成新類型,但我看不出爲什麼要這樣。 – SoftMemes 2010-10-24 13:09:34

+0

誠然,編寫代碼和編譯總是可能的,但這不是他想要做的。 – Aliostad 2010-10-24 13:12:01

+0

Reflection.Emit並不是真的「編寫代碼和編譯」,因爲沒有源代碼,但我同意這很可能不是他所需要的。 – SoftMemes 2010-10-24 13:20:06

0

難道你不能使用「Linq to DataSet」Field<T>(String Name)設計模式嗎?實際上,爲什麼不使用DataTable?編譯器不需要知道該字段是否存在,只需知道類型安全的類型即可。這樣做的一個原因是實現某種類型的解析器來生成過濾器,或動態配置字段名稱。