相关疑难解决方法(0)

WCF反序列化如何在不调用构造函数的情况下实例化对象?

WCF反序列化有一些神奇之处.如何在不调用其构造函数的情况下实例化数据协定类型的实例?

例如,考虑这个数据合同:

[DataContract]
public sealed class CreateMe
{
   [DataMember] private readonly string _name;
   [DataMember] private readonly int _age;
   private readonly bool _wasConstructorCalled;

   public CreateMe()
   {
      _wasConstructorCalled = true;
   }

   // ... other members here
}
Run Code Online (Sandbox Code Playgroud)

通过DataContractSerializer您获取此对象的实例时,您将看到该字段_wasConstructorCalledfalse.

那么,WCF如何做到这一点?这是其他人可以使用的技术,还是隐藏在我们之外?

.net c# reflection wcf serialization

78
推荐指数
2
解决办法
2万
查看次数

使用运行时确定的类型实例化对象

我处于这样一种情况,我想要实例化一个将在运行时确定的类型的对象.我还需要对该类型执行显式转换.

像这样的东西:

static void castTest(myEnum val)
{
    //Call a native function that returns a pointer to a structure
    IntPtr = someNativeFunction(..params..);

    //determine the type of the structure based on the enum value
    Type structType = getTypeFromEnum(val);

    structType myStruct = (structType)Marshal.PtrToStructure(IntPtr, structType);
}
Run Code Online (Sandbox Code Playgroud)

这显然不是有效的代码,但我希望它传达了我想要做的事情的本质.我实际工作的方法必须在~35种不同的类型上执行编组操作.我有几个其他方法需要使用相同的类型集来做类似的事情.所以,我想从这些方法中分离出类型决定逻辑,这样我只需要编写一次,这样方法就可以保持清晰和可读.

我必须承认自己是设计界的新手.有谁能建议一个很好的方法解决这个问题?我怀疑可能有一个我不知道的合适的设计模式.

.net c# design-patterns runtime

60
推荐指数
4
解决办法
8万
查看次数

Activator.CreateInstance找不到构造函数(MissingMethodException)

我有一个具有以下构造函数的类

public DelayCompositeDesigner(DelayComposite CompositeObject)
{
    InitializeComponent();

    compositeObject = CompositeObject;  
}
Run Code Online (Sandbox Code Playgroud)

以及没有参数的默认构造函数.

接下来我正在尝试创建一个实例,但它只能在没有参数的情况下工作:

var designer = Activator.CreateInstance(designerAttribute.Designer);
Run Code Online (Sandbox Code Playgroud)

这工作正常,但如果我想传递参数,它不会:

var designer = Activator.CreateInstance(designerAttribute.Designer, new DelayComposite(4));
Run Code Online (Sandbox Code Playgroud)

这导致MissingMethodException:

未找到构造函数类型Vialis.LightLink.Controller.Scenarios.Composites.DelayCompositeDesigner

这里有什么想法?


问题是我真的需要在施工期间传递一个物体.

你看我有一个设计器,它加载了从中继承的所有类型CompositeBase.然后将这些添加到列表中,用户可以从中将它们拖动到设计器.执行此操作后,将拖动的实例添加到设计器中.这些类中的每一个都定义了自定义属性:

[CompositeMetaData("Delay","Sets the delay between commands",1)]
[CompositeDesigner(typeof(DelayCompositeDesigner))]
public class DelayComposite : CompositeBase
{
}
Run Code Online (Sandbox Code Playgroud)

当用户选择设计器中的项目时,它会查看这些属性以便为该类型加载设计器.例如,在它的情​​况下,DelayComposite它将加载具有标签和滑块的用户控件,该标签和滑块允许用户设置DelayComposite实例的"延迟"属性.

到目前为止,如果我没有将任何参数传递给构造函数,这可以正常工作.设计者创建一个实例DelayCompositeDesigner并将其分配给WPF的content属性ContentPresenter.

但由于该设计人员需要在设计器中修改所选属性,因此DelayComposite 我必须将此实例传递给它.这就是为什么构造函数看起来像这样:

public DelayCompositeDesigner(DelayComposite CompositeObject)
{
    InitializeComponent();

    compositeObject = CompositeObject;
}
Run Code Online (Sandbox Code Playgroud)

欢迎提出建议


@VolkerK

您的代码的结果是这样的:

<---- foo Vialis.LightLink.Controller.Scenarios.Composites.DelayCompositeDesignerVoid .ctor()Vialis.LightLink.Controller.Scenarios.Composites.DelayCompositeDesignerVoid .ctor(Vialis.LightLink.Controller.Scenarios.Composites.DelayComposite)param:Vialis .LightLink.Controller.Scenarios.Composites.DelayComposite foo ---->


Leppie,你是对的,我出于某种原因在我的UI应用程序中引用了Composites程序集......这不是我在运行时加载它时应该做的事情.以下代码有效:

object …
Run Code Online (Sandbox Code Playgroud)

.net c# activator missingmethodexception

18
推荐指数
3
解决办法
4万
查看次数

C#将动态字符串转换为现有的Class

在Windows应用程序中,使用C#,我有一个报告模块,它将依赖于类来填充报告.但是会有很多报告,我不想为每个报告编写代码.

流程将如下:在报告编辑器中,报告将被分配一个类(即"应用程序")作为字符串.当用户选择要运行的报告时,代码将从SQL查询中获取数据.代码将获取数据并找出将数据放入哪个类.然后,报告将获取该类,并使用该类中的数据填充报告.

这是我的困境,我如何使代码动态化,以便代码将指定的类转换为适当的类对象?

记住的例子:

gVar = Report;
(gVar.ReportClass)oClass = new gVar.ReportClass;
Run Code Online (Sandbox Code Playgroud)

c# string class dynamic

11
推荐指数
1
解决办法
4万
查看次数