Как создать CodeFunction2 с IEnumerable <> Type? - PullRequest
1 голос
/ 12 октября 2009

Мне действительно нужно создать что-то вроде следующего, я строю 2 класса, первый класс с именем tableNameAsSingular (т.е. AddressEntity), во втором рабочем классе мне нужно что-то вроде следующего

public IEnumerable<AddressEntity> GetAddressEntity()
{
 // the good stuff...
}

При создании функции у меня следующее ..

Type t = Type.GetType("IEnumerable<" + tableNameAsSingular + ">");
CodeFunction2 finderFunction = (CodeFunction2)entityServiceClass.AddFunction("Get" + table.Name, vsCMFunction.vsCMFunctionFunction, t, -1, vsCMAccess.vsCMAccessPublic, null);

но t всегда равно нулю

Когда я делаю Type.GetType(tableNameAsSingular), он тоже возвращает ноль

Любая помощь или указатели будут с благодарностью приняты. Также, если кто-нибудь знает, где живет множество знаний по генерации кода EnvDTE, я был бы ооочень рад!


Обновление

Сейчас я попробовал это как строку, используя следующее:

   public void AddFinderMethod()
    {
        string t = "IEnumerable<" + tableNameAsSingular + ">";
        CodeFunction2 finderFunction = (CodeFunction2)entityServiceClass.AddFunction("Get" + table.Name, vsCMFunction.vsCMFunctionFunction, t, -1, vsCMAccess.vsCMAccessPublic, null);
        // Code here remove as it does not get this far yet.
    }

но я получаю сообщение об ошибке "IEnumerable<ProductEntity> is not a valid identifier" в методе AddFunction

Ответы [ 2 ]

3 голосов
/ 12 октября 2009

Синтаксис IEnumerable<T> - это синтаксис C #, а не синтаксис .NET (который использует обратные тики, счетчики и т. Д.). Что вы имеете в виду:

Type tableType = Type.GetType(assemblyQualifiedNameToEntity);
Type enumerableType = typeof(IEnumerable<T>).MakeGenericType(tableType);

Обратите внимание, что Assembly.GetType обычно является лучшим выбором, так как вы можете просто использовать имена, уточненные в пространстве имен:

Assembly asm = typeof(SomeKnownType).Assembly;
Type tableType = asm.GetType(namespaceQualifiedNameToEntity);
0 голосов
/ 14 октября 2009

удалось заставить его работать со следующим:

string returnType = "System.Collections.Generic.IEnumerable<" + tableNameAsSingular + ">"; 
CodeFunction2 finderFunction = (CodeFunction2)entityServiceClass.AddFunction("Get" + table.Name, vsCMFunction.vsCMFunctionFunction, returnType, -1, vsCMAccess.vsCMAccessPublic, null);
...