如何使"as Class",其中Class是字符串名称?
How to make "as Class", Where Class is string name?
我的系统中收集了 classes。所以,我也有一个简单的配置文件,其中包含 class 个名称。
我想 运行 编码如下:
(object as Class).name="some text";
其中 Class 是他的 class 配置文件中的名称字符串。也许我应该使用反射来做到这一点?
谢谢!
可以忽略类型,直接使用dynamic
(内部使用反射)...
object obj = ...
dynamic dyn = obj;
dyn.name = "some text";
这仅在 name
为 public
时有效。否则你可以使用反射...
如果 name
是 属性:
Type type = obj.GetType();
PropertyInfo prop = type.GetProperty("name", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
prop.SetValue(obj, "some text");
如果是字段:
Type type = obj.GetType();
FieldInfo field = type.GetField("name", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
field.SetValue(obj, "some text");
如果class名称在编译时不可用,则必须使用反射或DLR(动态)设置属性。
在此处查看更多答案Set object property using reflection
很难准确地说出您的用例是什么,但从另一个角度来看您的问题可能会有所帮助。我假设您可以在配置中指定的所有 classes 都具有相同的 属性(即 name
)。如果是这种情况,您可以让所有 classes 实现相同的接口,然后您无需担心 class 名称。例如:
您的界面:
public interface IName
{
string Name { get; set; }
}
A class 使用接口:
public class Something : IName
{
public string Name { get; set; }
public string AnotherProperty { get; set; }
}
以及使用任何实现 IName
接口的对象的方法:
public void DoSomething(IName input)
{
Console.WriteLine(input.Name);
}
所以现在您可以调用该方法而不必担心 class 名称:
var someObject = new Something();
someObject.Name = "Bob";
DoSomething(someObject);
我的系统中收集了 classes。所以,我也有一个简单的配置文件,其中包含 class 个名称。
我想 运行 编码如下:
(object as Class).name="some text";
其中 Class 是他的 class 配置文件中的名称字符串。也许我应该使用反射来做到这一点?
谢谢!
可以忽略类型,直接使用dynamic
(内部使用反射)...
object obj = ...
dynamic dyn = obj;
dyn.name = "some text";
这仅在 name
为 public
时有效。否则你可以使用反射...
如果 name
是 属性:
Type type = obj.GetType();
PropertyInfo prop = type.GetProperty("name", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
prop.SetValue(obj, "some text");
如果是字段:
Type type = obj.GetType();
FieldInfo field = type.GetField("name", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
field.SetValue(obj, "some text");
如果class名称在编译时不可用,则必须使用反射或DLR(动态)设置属性。
在此处查看更多答案Set object property using reflection
很难准确地说出您的用例是什么,但从另一个角度来看您的问题可能会有所帮助。我假设您可以在配置中指定的所有 classes 都具有相同的 属性(即 name
)。如果是这种情况,您可以让所有 classes 实现相同的接口,然后您无需担心 class 名称。例如:
您的界面:
public interface IName
{
string Name { get; set; }
}
A class 使用接口:
public class Something : IName
{
public string Name { get; set; }
public string AnotherProperty { get; set; }
}
以及使用任何实现 IName
接口的对象的方法:
public void DoSomething(IName input)
{
Console.WriteLine(input.Name);
}
所以现在您可以调用该方法而不必担心 class 名称:
var someObject = new Something();
someObject.Name = "Bob";
DoSomething(someObject);