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
运算符。
我有以下工作代码,它使用程序集从加载的 .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
运算符。