2015-06-26 2 views
3

У меня есть коллекция классов в моей системе. Итак, у меня есть простой файл конфигурации с коллекцией имен классов.Как сделать «как класс», где «Класс» является строковым именем?

И я хочу, чтобы запустить такой код:

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

Где Class его имя класса строка из конфигурационного файла. Может быть, я должен использовать рефлексию для этого?

Спасибо!

+0

Чтобы уточнить, вы хотите, чтобы ваш объект был передан классу, изображенному в строке, содержащейся в файле конфигурации? – JRLambert

+0

Как вы создаете экземпляры этих классов? –

+1

Что делать, если класс не имеет свойства имени? –

ответ

6

Вы можете игнорировать тип и непосредственно использовать 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"); 
1

Если имя класса не доступен во время компиляции, должны использовать отражение или DLR (динамический), чтобы установить свойство.

Смотреть больше в ответ здесь Set object property using reflection

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); 
Смежные вопросы