Анонимные Типы - Являются там какими-либо distingushing характеристиками?

Так что я думаю, что ваша проблема в Workbooks.Add (). Посмотрите, что Microsoft говорит об этом:

[Workbooks.Add ()] Определяет, как создается новая книга. Если этот аргумент является строкой, указывающей имя существующего файла Microsoft Excel, новая книга создается с указанным файлом в качестве шаблона.

Я считаю, что создаваемая книга - это точная копия того, что есть на сервере sharepoint, включая разрешения. Тот факт, что он работает локально, является еще одним признаком того, что sharepoint может возиться с разрешениями.

Я предлагаю попробовать сохранить копию файла локально. Вы даже можете использовать объект SaveFileDialog, чтобы предоставить пользователю графический интерфейс для сохранения его новой копии.

SaveFileDialog userSaveFileDialog = new SaveFileDialog();  
userSaveFileDialog.Filter = "Excel 2007 and later | *.xlsx, Excel Macro Enabled Worksheet | *.xlsm, I'm guessing this is a 2007 template | *.xltx, Template Macro maybe | *.xltm, I almost definitely think this is a template file | *.xlt";  
userSaveFileDialog.Title = "Save an Excel File";  
userSaveFileDialog.ShowDialog();  
this.Application.ActiveWorkbook.SaveCopyAs(@userSaveFileDialog.FileName);

Как только вы закончите, вы можете программно открыть вновь сохраненную книгу, используя userSaveFileDialog.FileName в качестве пути к файлу.

26
задан Hugoware 24 November 2008 в 19:21
поделиться

3 ответа

РЕДАКТИРОВАНИЕ: список ниже относится к анонимным типам C#. VB.NET имеет различные правила - в частности, это может генерировать изменяемые анонимные типы (и делает по умолчанию). Jared указал в комментарии, что стиль именования отличается, также. В основном это все довольно хрупко...

Вы не можете определить его в универсальном ограничении, но:

  • Это будет класс (а не интерфейс, перечисление, структура и т.д.)
  • , Это будет иметь , CompilerGeneratedAttribute относился к нему
  • , Это переопределит, Равняется, GetHashCode и ToString
  • , которым Это будет в глобальном пространстве имен
  • , Это не будет вложено в другом типе
  • , Это будет внутреннее
  • , Это будет изолировано
  • , Это произойдет непосредственно от object
  • , Это будет универсально со столькими же параметров типа сколько свойства. (Вы можете иметь неуниверсальный анонимный тип без свойств. Это немного бессмысленно все же.)
  • Каждое свойство будет иметь параметр типа с именем включая имя свойства и будет того параметра типа, например, свойство Name становится свойством типа <> _Name
  • Каждое свойство будет общедоступно и только для чтения
  • Для каждого свойства будет соответствующее частное поле
  • только для чтения не будет никаких других свойств или полей
  • будет конструктор, берущий один параметр, соответствующий каждому параметру типа в том же порядке как параметры типа
  • , Каждый метод и свойство будут иметь , DebuggerHiddenAttribute относился к нему.
  • название типа запустится с "<>" и содержат "AnonymousType"

, который Очень мало этого гарантируется спецификацией, однако - таким образом, это могло все измениться в следующей версии компилятора, или если Вы используете Моно и т.д.

55
ответ дан 28 November 2019 в 06:45
поделиться

Как я вспоминаю, существует [CompilerGenerated] маркер... 2 secs

Плюс имя будут причудливы, и это будет универсальный тип;-p

На самом деле, для того, "чтобы получать" и т.д. я, вероятно, просто использовал бы статический (недополнительный) метод.

, Если Вы просто хотите способ получить значение от экземпляра скоро-типа (позже), лямбда является, вероятно, наилучшим вариантом - отмечают, что Вам нужны несколько приемов для осуществления этого:

    static void Main()
    {
        var foo = new { name = "John", age = 25 };
        var func = Get(foo, x => x.age);
        var bar = new { name = "Marc", age = 30 };
        int age = func(bar);
    }
    // template here is just for type inference...
    static Func<TSource, TValue> Get<TSource, TValue>(
        TSource template, Func<TSource, TValue> lambda)
    {
        return lambda;
    }

(ре редактирования комментарий) Там определенно этот атрибут:

        var foo = new { A = "B" };
        Type type = foo.GetType();

        CompilerGeneratedAttribute attrib = (CompilerGeneratedAttribute) Attribute.GetCustomAttribute(
            type, typeof(CompilerGeneratedAttribute)); // non-null, therefore is compiler-generated
4
ответ дан 28 November 2019 в 06:45
поделиться

В целях дополнительных методов нет никакого способа отличить анонимный тип. Дополнительные методы работают путем определения метода в течение времени компиляции nameable тип. Анонимные типы являются un-namable и поэтому не видимые во время компиляции. Это делает их несовместимыми с дополнительными методами.

0
ответ дан 28 November 2019 в 06:45
поделиться