Мы использовали aspectJ в одном из моих больших проектов в течение достаточно долгого времени. Проект был составлен из нескольких веб-сервисов, каждого с несколькими функциями, который был фронтэндом для сложной обработки документов / запросы системы. Где-нибудь вокруг 75k строк кода. Мы использовали аспекты для двух относительно незначительных частей функциональности.
Первый прослеживал поток приложения. Мы создали аспект, который работал прежде и за каждым вызовом функции распечатать "вводимую 'функциональную'" и "'функцию', из которой выходят". С функциональной селекторной вещью (pointcut, возможно? Я не помню правильное имя), мы смогли использовать, это как средство отладки, выбирая только функционирует, который мы хотели проследить в установленный срок. Это было действительно хорошим использованием для аспектов в нашем проекте.
второй вещью, которую мы сделали, были специализированные метрики. Мы помещаем аспекты вокруг наших методов веб-сервиса, чтобы получить синхронизацию, информацию об объекте, и т.д. и вывести результаты в базе данных. Это было хорошо, потому что мы могли получить эту информацию, но все еще разделить весь тот код получения от "реального" кода, который сделал работу.
я читал о некоторых хороших решениях, которые аспекты могут принести к таблице, но я все еще не убежден, что они могут действительно сделать что-либо, что Вы не могли сделать (возможно, лучше) с "нормальной" технологией. Например, я не мог думать ни о какой основной функции или функциональности, в которой любой из наших проектов был нужен, который не мог быть сделан столь же легко без аспектов - где я нашел, что полезными аспектами является вид незначительных вещей, которые я упомянул.
В итоге я нашел решение с помощью метода reader.GetName (int)
. Я создал метод ниже, чтобы охватить эту логику:
public bool ColumnExists(IDataReader reader, string columnName)
{
for (int i = 0; i < reader.FieldCount; i++)
{
if (reader.GetName(i).Equals(columnName, StringComparison.InvariantCultureIgnoreCase))
{
return true;
}
}
return false;
}
Похоже, я исправился. Я знаю , что там указаны ваши настоящие имена столбцов, но я пошел по неправильному пути. Эта ссылка помогла немного прояснить ситуацию, но я все еще не уверен, есть ли элегантный способ сделать это. В соответствии с приведенной выше ссылкой вы можете получить список всех своих столбцов следующим образом:
List<string> myCols = new List<string>();
DataTable schema = reader.GetSchemaTable();
foreach (DataRow row in schema.Rows)
{
myCols.Add(row[schema.Columns["ColumnName"]]);
}
К сожалению, похоже, что вы можете получить доступ только к schema.Rows по индексу, поэтому я не уверен, что вы можете обойтись без цикла по строкам сначала перед проверкой по имени. В этом случае ваше исходное решение кажется гораздо более элегантным!
Примечание: в моем исходном ответе предлагалось проверить наличие столбца просто с помощью: reader.GetSchemaTable (). Columns ["optionalfield"].
Загрузите его в DataTable и затем вы можете проверить столбец:
DataTable dataTable = new DataTable();
dataTable.Load(reader);
foreach (var item in dataTable.Rows)
{
bool columnExists = item.Table.Columns.Contains("ColumnName");
}
Не нужно столько усложнений, просто это:
bool bFieldExists = datareader.GetSchemaTable().Columns.Contains(strFieldName);