Тип или имя пространства имен Edm не может быть найдено, если вы пропустили директиву using или ссылку на сборку
Все:
Подробная информация о технической среде, используемой для разработки приложения ASP.NET:
- .NET Framework 4.5
- Microsoft Visual Studio 2012 Ultimate с обновлением 4
- System.Web.Http.OData (версия 5.3.1.0) как сборка.NET в ссылках в Visual Studio
- System.Web.OData (версия 5.3.1.0) как сборка.NET в ссылках в Visual Studio
- Microsoft.OData.Edm (Версия 6.8.1.0) как сборка.NET, на которую ссылаются, в Visual Studio
У нас есть класс, который содержит следующий метод удаления в:
public IHttpActionResult Delete ([FromODataUri] Edm.Guid id) {...}
К сожалению, вышеупомянутый метод Edm.Guid жалуется на следующую ошибку:
Не удалось найти тип или имя пространства имен 'Edm' (вам не хватает директивы using или ссылки на сборку?)
Я не могу удалить Edm, потому что вышеупомянутый код генерируется с использованием шаблонов T4, и удаление Edm будет проблемой.
В любом случае, могут ли некоторые помочь мне, рассказав мне, как указанный код будет работать таким образом, что Edm будет распознаваться?
-Обновление Я нашел нетрадиционное решение, которое мне не нравится, потому что оно довольно простое, то есть как взлом.
В моем шаблоне T4 у меня есть следующее:
var keyParameters = string.Join(", ", keys[entityName].Select(key => "[FromODataUri] " + (key.TypeUsage.ToString()).Substring((key.TypeUsage.ToString()).IndexOf(".") + 1).Trim() + " " + code.Escape(key.Name).ToLower()));
...........
........
.....
public IHttpActionResult Delete(<#= keyParameters #>) {
...........
........
.....
Это несложно, потому что я делаю странные манипуляции со строками, чтобы избавиться от всего, что связано с чем-то вроде "Эдм".:
(key.TypeUsage.ToString()).Substring((key.TypeUsage.ToString()).IndexOf(".")
Пожалуйста, не стесняйтесь предложить лучшее альтернативное решение.
1 ответ
Похоже, вы пытаетесь разобрать имя типа OData. Они общеизвестны и обычно анализируются с помощью сопоставления имени с типом, а не путем обработки строк. Будет работать что-то вроде следующего:
var typeMap = new Dictionary<string, Type>
{
{ "Edm.Binary", typeof(Byte[]) },
{ "Edm.Boolean", typeof(Boolean) },
{ "Edm.Byte", typeof(Byte) },
{ "Edm.DateTime", typeof(DateTime) },
{ "Edm.Decimal", typeof(Decimal) },
{ "Edm.Double", typeof(Double) },
{ "Edm.Single", typeof(Single) },
{ "Edm.Guid", typeof(Guid) },
{ "Edm.Int16", typeof(Int16) },
{ "Edm.Int32", typeof(Int32) },
{ "Edm.Int64", typeof(Int64) },
{ "Edm.SByte", typeof(SByte) },
{ "Edm.String", typeof(String) },
{ "Edm.Time", typeof(TimeSpan) },
{ "Edm.DateTimeOffset", typeof(DateTimeOffset) },
}
var edmTypeName = "Edm.Guid";
var typeName = "global::" + typeMap.SingleOrDefault(t => t.Key.Equals(edmTypeName, StringComparison.CurrentCultureIgnoreCase)).Value.FullName;
Debug.Assert(typeName == "global::System.Guid");
Тем не менее, вы можете стать умным, используя псевдонимы System
Пространство имен. Добавление using Edm = System;
к началу шаблона будет работать для большинства примитивных типов, но это взломать.