Ответ 1
public class WebPartWrapper : System.Web.UI.WebControls.WebParts.WebPart {
protected override void CreateChildControls() {
Panel pnl = new Panel();
this.Controls.Add(pnl);
var factory = new WebPartFactory()
WebPart dynamicPart = factory.CreateWebPart("RSSViewer", this.Guid);
pnl.Controls.Add(dynamicPart);
}
}
public class WebPartFactory {
public WebPart CreateWebpart(string webpartName, Guid parentWebPartGuid)
{
var config = ConfigurationFactory.LoadConfiguration(webpartName);
Assembly webPartAssembly = Assembly.Load(config.Assembly);
Type webPartType = webPartAssembly.GetType(config.Class);
object actualWebPart = Activator.CreateInstance(webPartType);
foreach (var item in config.Properties)
{
PropertyInfo webPartProperty = webPartType.GetProperty(item.Name);
object webPartPropertyValue = Convert.ChangeType(itemValue, Type.GetType(item.Type));
if (!String.IsNullOrEmpty(item.Value))
webPartProperty.SetValue(actualWebPart, webPartPropertyValue, null);
}
RunMethod("set_StorageKeyInternal", actualWebPart, new object[] { parentWebPartGuid });
return actualWebPart as WebPart;
}
private void RunMethod(string methodName, object objectInstance, object[] methodParameters)
{
BindingFlags flags = BindingFlags.Instance | BindingFlags.Public |
BindingFlags.NonPublic;
Type t = objectInstance.GetType();
MethodInfo m = GetMethod(t, methodName, flags);
if (m != null)
{
m.Invoke(objectInstance, methodParameters);
}
}
private MethodInfo GetMethod(Type instanceType, string methodName, BindingFlags flags)
{
MethodInfo m = instanceType.GetMethod(methodName, flags);
if (m != null)
{
return m;
}
if (instanceType.GetType() == typeof(object) || instanceType.BaseType == null)
{
return null;
}
return GetMethod(instanceType.BaseType, methodName, flags);
}
}
Этот код нуждается в некотором объяснении... Пожалуйста, извините меня, если он не компилируется, мне пришлось удалить справедливый бит исходного кода, это было очень специфическое для конкретной реализации. Я также не показал класс "config", это просто контейнер для конфигурации веб-страниц, всего лишь набор свойств. Есть два вопроса, которые я хотел бы обсудить более подробно:
-
parentWebPartGuid - это Guid (UniqueId?) веб-сайта хостинга. По какой-то причине мы должны установить значение "StorageKeyInternal" для этого значения, используя отражение (это частная собственность). Вы можете уйти, не устанавливая его, но, по крайней мере, для большинства веб-сайтов мы должны были установить его.
-
config.Properties - это значения конфигурации (мы установили их в пользовательский .xml файл, но не стесняйтесь получать это из любого места). Это может выглядеть немного как this.
В наших рамках мы также поддерживаем такие вещи, как динамические значения свойств и т.д., но это на другой день... Надеюсь, это все имеет смысл и может помочь кому-то.