Никто не предоставил « классическое решение Reflection », так что вот полный пример кода:
using System;
using System.Collections;
using System.Collections.Generic;
namespace DictionaryRuntime
{
public class DynamicDictionaryFactory
{
/// <summary>
/// Factory to create dynamically a generic Dictionary.
/// </summary>
public IDictionary CreateDynamicGenericInstance(Type keyType, Type valueType)
{
//Creating the Dictionary.
Type typeDict = typeof(Dictionary<,>);
//Creating KeyValue Type for Dictionary.
Type[] typeArgs = { keyType, valueType };
//Passing the Type and create Dictionary Type.
Type genericType = typeDict.MakeGenericType(typeArgs);
//Creating Instance for Dictionary<K,T>.
IDictionary d = Activator.CreateInstance(genericType) as IDictionary;
return d;
}
}
}
Выше DynamicDictionaryFactory
класс имеет метод
CreateDynamicGenericInstance(Type keyType, Type valueType)
, и он создает и возвращает экземпляр IDictionary, типы ключей и значений которых точно указаны в запросе keyType
и valueType
.
Вот полный пример того, как вызвать этот метод для создания экземпляра и использования Dictionary<String, int>
:
using System;
using System.Collections.Generic;
namespace DynamicDictionary
{
class Test
{
static void Main(string[] args)
{
var factory = new DictionaryRuntime.DynamicDictionaryFactory();
var dict = factory.CreateDynamicGenericInstance(typeof(String), typeof(int));
var typedDict = dict as Dictionary<String, int>;
if (typedDict != null)
{
Console.WriteLine("Dictionary<String, int>");
typedDict.Add("One", 1);
typedDict.Add("Two", 2);
typedDict.Add("Three", 3);
foreach(var kvp in typedDict)
{
Console.WriteLine("\"" + kvp.Key + "\": " + kvp.Value);
}
}
else
Console.WriteLine("null");
}
}
}
. Когда указанное консольное приложение выполняется, мы получаем правильный ожидаемый результат:
Dictionary<String, int>
"One": 1
"Two": 2
"Three": 3
Я знаю о стороннем компоненте, который может сделать это. Это звонило " swfupload" и свободно использовать и открытый исходный код и использует JavaScript и флэш-память, чтобы сделать волшебство.
вот список функций, которые они предлагают: (от их сайта)
- Загрузка несколько файлов сразу ctrl/shift-selecting в диалоговом окне
- обратные вызовы JavaScript на всех событиях
- Получают информацию файла, прежде чем загрузка запустится
- элементы загрузки Стиля с XHTML и информацией о Дисплее css
- , в то время как файлы загружают использование, страница No HTML
- перезагружает необходимый
- Работы над всеми платформами/браузерами, который имеет поддержку Flash.
- Ухудшается корректно к нормальной форме загрузки HTML, если Flash или JavaScript недоступны
- размер файла Управления, прежде чем загрузка запустится
- Только дисплей выбранные типы файлов в диалоговом окне
- загрузки Очереди, удалите/добавьте файлы перед стартовой загрузкой
, Они также имеют демонстрационная область , где можно играть вокруг с их управлением. Тем путем можно удостовериться, что это точно, что Вы хотите.
Мы использовали его в одном из наших проектов, и это никогда не приводило нас к сбою до сих пор, таким образом, я думаю, что это - безопасная ставка.
, о, и вот страница загрузки: http://code.google.com/p/swfupload/
Вы не можете загрузить файл (файлы) через AJAX
только путем перезагрузки целого HTML
документ. Необходимо или использовать iframe
с, если Вы предпочитаете чистый HTML (это более распространено, например, используемое WordPress), или что-то еще как swfupload, предложенный Sven.
Добавьте это к своему кнопочному управлению:
OnClientClick="javascript:document.forms[0].encoding = 'multipart/form-data';"
- или
Заставляют Ваш Тег form страницы быть похожим:
<form id="form1" runat="server" enctype="multipart/form-data">
Я нашел это на днях, когда я столкнулся с той же проблемой: http://vinayakshrestha.wordpress.com/2007/03/13/uploading-files-using-aspnet-ajax-extensions/ .
Для моей реализации, я поместил iframe в модальное всплывающее окно и добавил кнопку со стилем = "display:none" для обработки закрытия всплывающего окна. В функции JavaScript, которая наблюдает за изменением в iframe, я добавил document.getElementById (" < % =btnCloseUpload. % ClientID>"). нажмите (); для скрытой кнопки.
Попробуйте использовать AJAX AsyncFileUpload. Он хорошо работает, если использовать его по назначению (обрабатывать событие UploadedComplete).
http://www.asp.net/AJAX/AjaxControlToolkit/Samples/AsyncFileUpload/AsyncFileUpload.aspx