2013-07-03 4 views
0

Я работаю над приложением, которое взаимодействует с SharePoint 2010, и один из объектов SP (SPFolder.Subfolders[index], если вам интересно) требует строки для индексации возвращаемых элементов. Проблема в том, что мне нужно передать ему строковую переменную, но она принимает только литералы. Есть ли способ конвертировать переменную в литерал для этой цели? Если вопрос не является достаточно ясным, смотрите иллюстрацию ниже:C# - превращение строковой переменной в строковый литерал

SPFolder folder = rootFolder.SubFolders["Literal folder name"]; // This properly searches the collection (which has already been defined) and returns the folder with the name specified by the literal. 

string newFolder = "Literal folder name"; // In this case I'm trying to pass this string as the index. 
SPFolder folder = rootFolder.SubFolders[newFolder]; // This is where it throws a "Value does not fall within the expected range" exception when the string is referenced. 

Если контекст помогает, приложение принимает массив имен папок и их создания на определенном уровне в библиотеке, а затем цикл через новый папки для создания сложной структуры папок внутри них. Для этого мне нужно создать папку, получить ее url, а затем создать остальные папки на основе этого URL-адреса. Извлечение вновь созданной папки - это то, где я столкнулся с трудностями, потому что индексирование родительской папки со строкой, которую я только что создавал, - это то, где она сходит с ума.

+0

Вы можете сделать строку newFolder = @ "Новое имя папки"; ? – Sherlock

+0

Просто дал ему шанс, не повезло:/ – thanby

ответ

1

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

http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.spfoldercollection(v=office.14).aspx

+0

Это должно теоретически работать, но требует много дополнительного кода для возврата индекса int, поэтому, если я могу избежать его, это было бы хорошо. Если это действительно единственное решение, я поеду с ним. Спасибо за идею! – thanby

+0

Да, вы могли бы, очевидно, сократить его с помощью метода помощи LINQ select, который был бы быстрее, чем стиль for loop. Не идеальный, но функциональный, надеюсь. 'MyCollection.Select (m => m.Name == myNameVariable) .FirstOrDefault()' – mckeejm

2

Это то же самое:

SPFolder folder = rootFolder.SubFolders["Literal folder name"]; 

string folderName = "Literal folder name"; 
SPFolder folder = rootFolder.SubFolders[folderName]; 

В вашем примере, строки имеют различные значения, которые приведут к разным результатам.

+0

В реальном приложении это не имеет значения. Объект папки создается со строкой, затем в индекс передается одна и та же строка. Пример, который я привел выше, буквально не передается (каламбур не предназначен). Я исправил этот пример, чтобы прояснить это. – thanby

+0

@thanby Я подозреваю, что строки, по сути, разные. Попробуйте отладить, проверяя, является ли '' Literal имя папки "== folderName" истинным или ложным. –

+0

Уже сделал. Трассировка показывает, что каждый экземпляр переменной 'newFolder' является согласованным, даже тот, где он терпит неудачу. Одна и та же переменная используется в нескольких разных точках во время каждой итерации цикла, и здесь она не работает. Я почти уверен, что это ошибка SharePoint за то, что она придирчива. Если бы мне пришлось угадать WILD, это фактически не посылает литерал классу объектов, он отправляет ссылку, и класс не хочет искать ссылку. Таким образом, трассировка показывает правильный литерал, потому что он выглядит вверх, а класс - нет. Имеет ли это смысл? – thanby

0

Вы пытались использовать дословные строковые литералы?

var testString = @"This is a verbatim string literal"; 

MSDN также имеет хорошее объяснение различий между строковых литералов и стенографических строковых литералов.

+0

Я действительно попробовал это. К сожалению, он дал те же результаты. Спасибо за предложение, хотя! – thanby

Смежные вопросы