2016-05-14 4 views
0

Я пытаюсь получить объект для использования из строки. Как я могу это сделать? программа должна получить выбранный текст комбинированного текста и данные поиска с ним в MongoDB.Как преобразовать строку в имя объекта класса

string parameter = cmbSearch.Text; 
var results = collection.AsQueryable().Where(b => b.parameter.StartsWith(txtSearch.Text)); 

Это должно выглядеть так, я думаю. b.parameter подмена b.Author или b.Title ...

Вот мой Книги класс:

class Books 
{ 
    [BsonId] 
    public string ISBN { get; set; } 
    [BsonIgnoreIfNull] 
    public string Title { get; set; } 
    [BsonIgnoreIfNull] 
    public string Author { get; set; } 
    [BsonIgnoreIfNull] 
    public string Editor { get; set; } 
    [BsonIgnoreIfNull] 
    public string Year { get; set; } 
    [BsonIgnoreIfNull] 
    public int No { get; set; } 
    [BsonIgnoreIfNull] 
    public string Publisher { get; set; } 
    [BsonIgnoreIfNull] 
    public string PageSetup { get; set; } 
    [BsonIgnoreIfNull] 
    public string OriginalLanguage { get; set; } 
    [BsonIgnoreIfNull] 
    public string Translator { get; set; } 
    [BsonIgnoreIfNull] 
    public string OriginalName { get; set; } 
    [BsonIgnoreIfNull] 
    public int Count { get; set; } 
} 
+0

Какой тип 'коллекция'? является ли 'b.parameter' псевдокодом? Каким образом combobox или mongoDB относятся к вашей проблеме? Пожалуйста, попробуйте уточнить свой вопрос. –

+0

b.parameter - это псевдокод. Он должен представлять то, что выбрано в combobox. в примере: если текст combobox является Автором b.parameter представляет b.Author, но я просто могу выбрать один из свойств Books (например, author, title, isbn и т. д.). Я хочу сделать полный поиск во всех полях только с одним текстовым полем в mongoDB. –

ответ

0

Я думаю, что Activator.CreateInstance должно помочь.

Попробуйте использовать его как это:

Type elementType = Type.GetType(cmbSearch.Text); //Be careful here if elementType is null. You must provide it like this: Type.GetType("MyProject.Domain.Model." + myClassName + ", AssemblyName"); 

dynamic dO = Activator.CreateInstance(elementType); 

Вы можете найти пример кода на rextester.

+0

имеет ошибку: значение не может быть нулевым. elementType - null. Вы можете найти лучшее выражение в комментариях –

0

Ваша проблема может быть решена отражение - API, входящий в состав .Net FW, который вы можете использовать для работы с метаданными ваших классов во время выполнения. Например, чтобы получить имена всех свойств или получить/установить значение для любого из них. Read more about it from MSDN.

Пример кода для инициализации выпадающий с действительными значениями:

var properties = typeof(Book).GetProperties(); 
List<String> comboboxValues = properties.Select(property => property.Name).ToList(); 

После пользователь данный вход:

String searchBy = "Author"; 
String searchValue = "Isaac Asimov"; 

List<Book> booksFromMongo = new List<Book>(); //TODO: Query mongo. 

PropertyInfo searchByProperty = typeof(Book).GetProperty(searchBy); 
List<Book> matches = booksFromMongo 
    .Where(book => (String) searchByProperty.GetValue(book) == searchValue) 
    .ToList(); 

Очевидно, что вам нужно сделать больше трюков, чтобы подтвердить ввод данных, обрабатывать различные типы в Comparion, и т. д., но это должно заставить вас начать.

Смежные вопросы