和工厂有什么区别Activator.CreateInstance?它们可以互换使用吗?或者我们还需要工厂模式吗?
我正在使用反射创建一个对象的实例,并在对象的类中获取方法,但是当我必须使用类型数组Type来避免歧义问题时,问题就来了,这里是我的代码示例我试图达到.
public class BigClass
{
public void getSomething(XmlDocument doc, ref CustomObject obj) {...}
public void getSomething(XmlDocument doc, ref CustomObject obj, string id) {...}
}
Run Code Online (Sandbox Code Playgroud)
此代码来自外部程序集(file.dll),我正在使用下一个代码.
Assembly a = Assembly.LoadFrom("file.dll");
Type s = a.GetType("FileNamespace.BigClass");
MethodInfo inf = s.GetMethod("getSomething", new [] {typeof(XmlDocument), typeof(CustomObject), typeof(string)});
Run Code Online (Sandbox Code Playgroud)
要获取MethodInfo使用3个参数的对象,但变量"inf"为空,我认为因为它没有找到使用"ref"的参数的方法.
有办法解决这个问题吗?
我在 Pyomo 中构建了一个抽象模型,效果很好。
但是,当我尝试使用字典来实例化抽象模型时,出现以下错误“错误:为目标值生成表达式时规则失败:RuntimeError:在构造(初始化)之前无法迭代抽象集'I' .”
具体来说,问题如下:
from pyomo.environ import *
model = AbstractModel()
model.D = Set()
model.I = Set()
model.w = Param(model.D)
model.S_0 = Param(model.D)
model.x = Var(real_model.I, model.D)
def sum_cubic(m):
return sum(w[j]*(m.x[i][j]-m.S_0[j])**3 for i in model.I for j in model.D)
model.value = Objective(rule = sum_cubic, sense = maximize)
model.pprint()
Run Code Online (Sandbox Code Playgroud)
上面的代码运行得很好。但是当我在它后面添加以下代码时会出现错误,其中名称和 S_0 是预定义的字典:
data = {None:{
'D':{None: names},
'I':{None: list(range(1,4))},
'w':[0.3,0.3,0.4],
'S_0':S_0,
}
}
real_model = model.create_instance(data)
Run Code Online (Sandbox Code Playgroud)
错误:为目标值生成表达式时规则失败:RuntimeError:无法在构造(初始化)之前迭代抽象集“I”。错误:从数据构建组件“值”=无失败:运行时错误:无法在构造(初始化)之前迭代抽象集“I”。
有人可以帮我吗?谢谢。
我正在尝试使用以下内容创建自定义用户控件:
var panel = new GenericAccordionPanel<ZoneReport, ZonesPanel, ZonesVM>(myVm.ZonesVm);
Run Code Online (Sandbox Code Playgroud)
GenericAccordionPanel 定义为:
public class GenericAccordionPanel<THeader, TBody, TViewModel> : UserControl
{
public Accordion Accordion { get; set; }
public GenericAccordionPanel(TViewModel vmItem)
{
this.Accordion = new Accordion();
//the constructor for ZoneReport(THeader) takes a ZonesVM (vmItem) as a parameter.
var zr = (THeader)Activator.CreateInstance(typeof(THeader), new { vmItem });
var exp = new Expander { Header = zr };
Accordion.Children.Add(exp);
base.Content = Accordion;
}
}
Run Code Online (Sandbox Code Playgroud)
问题是Activator.CreateInstance失败的原因如下MissingMethodException:
找不到类型'[namespace] .Zones.ZoneReport'的构造函数.
我怎样才能创造出一种意志ZoneReport?
我在使用反射实例化 DLL 文件中定义的类时遇到了一些麻烦。尽管代码看起来不错,但我在 Activator.CreateInstance 上得到了 TargetInvocationException。代码如下(目前只有一个 DLL 可用):
public Comparator()
{
string[] filePaths = Directory.GetFiles(@".\Extensions");
for (int i = 0; i < filePaths.Length; ++i)
{
var asm = Assembly.LoadFrom(Path.GetFullPath(filePaths[i]));
if (asm != null)
{
foreach (Type currType in asm.ExportedTypes)
{
if (!currType.IsAbstract && currType.IsPublic && typeof(SorterBase).IsAssignableFrom(currType))
{
Debug.WriteLine(currType); //outputs: BubbleSort.Sorter
var instance = Activator.CreateInstance(currType); //TargetInvocationException
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
这是我试图实例化的类:
using SortingLibrary;
using SortingFunctions;
namespace BubbleSort
{
public class Sorter : SorterBase //SorterBase is an abstract class defined in …Run Code Online (Sandbox Code Playgroud) 拥有Remember.cs:
namespace Tasks
{
public class Remember : Task
{
new public string name = typeof(Remember).Name;
new public Task.Priority priority = Task.Priority.High;
}
}
Run Code Online (Sandbox Code Playgroud)
Task.cs:
public abstract class Task
{
public string name;
public Task.Priority priority = Task.Priority.Low;
public enum Priority
{
High = 3,
Medium = 2,
Low = 1,
}
}
Run Code Online (Sandbox Code Playgroud)
当我使用以下方法创建此类的实例时:
Task task = (Task)Activator.CreateInstance(typeof(Remember));
Debug.Log(task.name + " - " + task.priority);
Run Code Online (Sandbox Code Playgroud)
任务的名称为空,优先级是Task.Priority枚举中可用的最小数字而不是选定的数字(高).
为什么不Activator.CreateInstance初始化那些变量呢?
我在工厂模式样式函数中使用(稍微扩展版本)以下代码:
public class SingleItemNew : CheckoutContext
{
public BookingContext Data { get; set; }
public SingleItemNew(BookingContext data)
{
Data = data;
}
}
public CheckoutContext findContext(BookingContext data)
{
Type contextType = Type.GetType("CheckoutProcesses." + data.Case.ToString());
CheckoutContext output =
Activator.CreateInstance(contextType, BindingFlags.CreateInstance, new[] { data }) as CheckoutContext;
return output;
}
但是,它会在运行时抛出一个未发现异常的构造函数,我无法弄清楚原因.
data.Case.ToString()方法返回一个类的名称SingleItemNew,它具有一个带有单个参数的构造函数.
有谁知道问题是什么?
干杯,艾德
看起来我可能以错误的方式接近这个方向,而且方向非常受欢迎.
我试图Start在我的解决方案中触发所有方法.
Start方法采用日期时间
但是,当试图将日期作为"调用"的参数传递时,我遇到了错误
无法从System.DateTime转换为object []
欢迎任何想法
谢谢gws
scheduleDate = new DateTime(2010, 03, 11);
Type[] typelist = GetTypesInNamespace(Assembly.GetExecutingAssembly(), "AssetConsultants");
foreach (Type t in typelist)
{
var methodInfo = t.GetMethod("Start", new Type[] {typeof(DateTime)} );
if (methodInfo == null) // the method doesn't exist
{
// throw some exception
}
var o = Activator.CreateInstance(t);
methodInfo.Invoke(o, scheduleDate);
}
Run Code Online (Sandbox Code Playgroud) 这是我的第一个问题!我想实例化一个COM对象并将其转换为IDispatchEx,以便我可以枚举其成员.这是一个例子:
Type _COMType = System.Type.GetTypeFromProgID("Scripting.FileSystemObject");
var _COMObject = (IDispatchEx)Activator.CreateInstance(_COMType);
我的IDispatchEx与本网站(不是我的网站)上的相同,只是GetNextDispID和GetMemberName返回一个int(我希望用于MSDN上描述的HRESULT ).
上面的例子不起作用.有没有办法实例化COM对象,就像从Active Scripting转换为IDispatchEx接口一样?
感谢您提供的所有帮助/建议!
在具有_com_ptr_t成员的C++类中,如果在同一指针上重复使用CreateInstance()以获取COM对象的新实例,而不首先执行Release(),则内存是否会泄漏?有充分证据表明,当其中一个智能指针超出范围时,ref计数会减少,而当封装指针是Detach()时则不会减少.MSDN似乎没有提到重复CreateInstance()时引用计数的含义.
我有一个基类,如下所示:
public Data()
{
id = num++;
SetVariables();
}
//fill every Variable varNames, parseInduction, noise, seperator in Children Classes
public Data(String line)
{
//first declare all variables in sub classes
if (id == 0)
throw new NotSupportedException("You are not allowed to use this constructor for creating the first instance!");
id = num++;
SetVariables();
parseLine(line);
}
Run Code Online (Sandbox Code Playgroud)
而且我还有一个扩展这个类的子类。
class DienstGruppe : Data
{
protected override void SetVariables(){
varNames = new String[] {"id", "name"};
parseInduction = "DienstGruppen = {";
parseEnd = "};";
beginOfDataLine …Run Code Online (Sandbox Code Playgroud) 下面的例子显示了意图。该示例迭代对象数组,并创建一个具有加载默认值的相同类型的数组。值本身不需要从一个列表复制到下一个列表。这是列表的“类型克隆”。
下面的代码会为激活器产生以下错误:
“System.Int32 不是 GenericTypeDefinition。MakeGenericType 只能在 Type.IsGenericTypeDefinition 为 true 的类型上调用。”
Activator、CreateInstance 和 MakeGenericType 的细节对我来说仍然有点混乱。
如何更改代码以避免错误?
任何建议,将不胜感激。
private void Test()
{
object[] a = new object[] {100, "Text", new clsMyClass()};
object[] b = new object[a.Length];
for (int i = 0; i < a.Length; i++)
{
b[i] = Activator.CreateInstance(a[i].GetType().MakeGenericType());
}
for (int i = 0; i < b.Length; i++)
{
Console.WriteLine(b[i].GetType().ToString());
}
}
Run Code Online (Sandbox Code Playgroud)
预期输出为:
结果值将是:
我在创建静态void Main()的程序集实例时遇到问题.
Heres是程序集的代码(.NET Exe)
namespace Test
{
internal static class Program
{
[STAThread]
private static void Main(string[] args)
Run Code Online (Sandbox Code Playgroud)
这是启动器代码:bin是一个包含从文件读取的程序集的字节数组.
Assembly asm = Assembly.Load(bin);
MethodInfo method = asm.EntryPoint;
object obj = asm.CreateInstance(method.ToString());
method.Invoke(obj, null);
Run Code Online (Sandbox Code Playgroud)
由于参数不匹配,obj始终为null并且Invoke抛出异常.