[英]C# Set Dictionary<String, Object> Values using Reflection
我有以下工作代碼,這是使用程序集從加載的.dll打開一個表單
Form main = (Form)CommandFacade.IModuleHandler.IHost as Form;
Assembly Assembly = (Assembly)IArticles.Assembly;
Type Type = Assembly.GetType("DAMS.Module.ARTICLES.Articles_Search", true);
Form Articles_Search = (Form)Activator.CreateInstance(Type) as Form;
Articles_Search.MdiParent = main;
Articles_Search.StartPosition = FormStartPosition.CenterScreen;
Articles_Search.Show();
但是我在這個Form和1 List(HiddenColumns)中聲明了1個Dictionary(FormBehavior),我需要為這個字典設置值,並使用反射將項添加到List中。 通常我使用此代碼,但我如何使用反射做到這一點?
Articles_Search.FormBehavior["Control"] = "Value";
Articles_Search.HiddenColumns.Add("article_cost");
這是Article_Search類:
public partial class Articles_Search : Form
{
// Actions Vars
public List<String> HiddenColumns = new List<String>();
public Dictionary<String, Object> FormBehavior = new Dictionary<String, Object> { "Control", null } };
}
要使用反射設置的屬性名為Item
:
var itemPropertyInfo = dictionary.GetType().GetProperty("Item");
SetValue
方法有一個重載,它接受Item
屬性所需的參數:
itemPropertyInfo.SetValue(dictionary, value, new[] { key });
如上所述使用反射等同於執行以下代碼:
dictionary[key] = value;
以上是關於如何使用反射在字典中設置值的一般答案。 要回答您的具體問題,該問題還涉及列表和可能是私有字段,我提供此代碼:
var formBehaviorFieldInfo = Articles_Search
.GetType()
.GetField("FormBehavior", BindingFlags.NonPublic | BindingFlags.Instance);
var formBehavior = formBehaviorFieldInfo.GetValue(Articles_Search);
var itemPropertyInfo = formBehavior.GetType().GetProperty("Item");
itemPropertyInfo.SetValue(formBehavior, "Control", new[] { "Value" });
var hiddenColumnsFieldInfo = Articles_Search
.GetType()
.GetField("HiddenColumns", BindingFlags.NonPublic | BindingFlags.Instance);
var hiddenColumns = hiddenColumnsFieldInfo.GetValue(Articles_Search);
var addMethodInfo = hiddenColumns.GetType().GetMethod("Add");
addMethodInfo.Invoke(hiddenColumns, new[] { "article_cost" });
在這種情況下,以下答案是不正確的。 我錯過了在編譯時沒有引用程序集。
我不明白為什么你需要反思。 您已經擁有所需類的實例,因此您可以直接訪問公共字段和屬性。 但是你沒有“看到”這個字段或屬性,因為你的變量是Form
類型。 試試這個:
Form main = (Form)CommandFacade.IModuleHandler.IHost;
Assembly Assembly = (Assembly)IArticles.Assembly;
Type Type = Assembly.GetType("DAMS.Module.ARTICLES.Articles_Search", true);
Articles_Search searchForm = (Articles_Search)Activator.CreateInstance(Type);
searchForm.MdiParent = main;
searchForm.StartPosition = FormStartPosition.CenterScreen;
searchForm.FormBehavior["Control"] = "Value";
searchForm.HiddenColumns.Add("article_cost");
searchForm.Show();
旁注:如果您已經使用了強制轉換運算符,則不需要as
運算符。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.