如何制作“;作为“类”;,其中Class是字符串名称

本文关键字:Class 字符串 其中 何制作 作为 | 更新日期: 2023-09-27 17:59:56

我的系统中有一组类。因此,我还有一个简单的配置文件,其中包含类名的集合。

我想运行这样的代码:

(object as Class).name="some text"; 

其中Class是配置文件中的类名字符串。也许我应该用反射镜来做这件事?

谢谢!

如何制作“;作为“类”;,其中Class是字符串名称

您可以忽略类型并直接使用dynamic(内部使用反射)。。。

object obj = ...
dynamic dyn = obj;
dyn.name = "some text";

仅当namepublic时,此操作才有效。否则你可以使用反射。。。

如果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");

如果类名在编译时不可用,则必须使用反射或DLR(动态)来设置属性。

请参阅此处的答案中的更多信息使用反射设置对象属性

很难准确说出您的用例是什么,但这里有另一个角度可以帮助您解决问题。我假设您可以在配置中指定的所有类都具有相同的属性(即name)。如果是这种情况,您可以让所有的类实现相同的接口,那么您就不需要担心类名了。例如:

您的界面:

public interface IName
{
    string Name { get; set; }
}

使用接口的类:

public class Something : IName
{
    public string Name { get; set; }
    public string AnotherProperty { get; set; }
}

以及一种使用任何实现IName接口的对象的方法:

public void DoSomething(IName input)
{
    Console.WriteLine(input.Name);
}

因此,现在您可以调用该方法,而不必担心类名:

var someObject = new Something();
someObject.Name = "Bob";
DoSomething(someObject);