如何制作“as class”,其中Class是字符串名称?

时间:2015-06-26 08:35:49

标签: c# reflection

我的系统中有一组课程。所以,我也有一个带有类名集合的简单配置文件。

我想运行这样的代码:

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

其中Class是来自配置文件的类名字符串。可能我应该使用refletion来做到这一点?

谢谢!

3 个答案:

答案 0 :(得分:6)

您可以忽略该类型并直接使用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");

答案 1 :(得分:1)

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

在此处Set object property using reflection

的答案中查看更多内容

答案 2 :(得分:1)

很难说出你的用例究竟是什么,但是这个问题的另一个角度可能有所帮助。我假设您在配置中指定的所有类都具有相同的属性(即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);