Тип или имя пространства имен 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; к началу шаблона будет работать для большинства примитивных типов, но это взломать.

Другие вопросы по тегам