簡體   English   中英

C#設置字典 <String, Object> 使用Reflection的值

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM