C# 使用反射设置字典 <String, Object> 值

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();

但是我已经在此表单中声明了 1 个字典 (FormBehavior) 和 1 个列表 (HiddenColumns),我需要为此字典设置值并使用反射将项目添加到列表中。 通常我使用这段代码,但我如何使用反射来做到这一点?

Articles_Search.FormBehavior["Control"] = "Value";
Articles_Search.HiddenColumns.Add("article_cost");

这是Article_Search Class:

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" });

在这种情况下,以下答案不正确。我错过了在编译时没有引用程序集。


我完全不明白你为什么需要反思。您已经拥有所需 class 的实例,因此您可以直接访问 public 字段和属性。但是你不是 "seeing" 这个字段或属性,因为你的变量是 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 运算符。