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您获取此对象的实例时,您将看到该字段_wasConstructorCalled是false.
那么,WCF如何做到这一点?这是其他人可以使用的技术,还是隐藏在我们之外?
我有类似的东西:
object[] parameter = new object[1];
parameter[0] = x;
object instantiatedType =
Activator.CreateInstance(typeToInstantiate, parameter);
Run Code Online (Sandbox Code Playgroud)
和
internal class xxx : ICompare<Type>
{
private object[] x;
# region Constructors
internal xxx(object[] x)
{
this.x = x;
}
internal xxx()
{
}
...
}
Run Code Online (Sandbox Code Playgroud)
我得到:
抛出异常:System.MissingMethodException:找不到类型为"xxxx.xxx"的构造函数..
有任何想法吗?
我正在使用别人的代码并尝试进行一些修改。所以我需要做的是采取以下措施:
RemoteFileDP remoteFile = new DPFactory().CreateRemoteFileDP(configData);
Run Code Online (Sandbox Code Playgroud)
并更改它,以便 RemoteFile 可以等于字符串变量中的内容。为了进一步解释,让我给出更多代码:
ConfigDP configData = new ConfigDP();
Run Code Online (Sandbox Code Playgroud)
因此上面的语句在remoteFile语句之前执行,并且ConfigDP上面有两个类(抽象Config和它的基类:抽象ConfigBase)。DP 也是它上面的两个抽象类(抽象 RemoteFile 和抽象 RemoteFileBase)的子类。
根据我的理解,remoteFile 是从数据库查询中提取数据的结果,存储到列表或哈希表中(对不起,只是一个实习生,所以我正在解决这个问题)。
我需要remoteFile接受字符串值的原因是因为有许多方法利用remoteFile中的信息,并且我希望避免必须创建一大堆接受字符串值而不是RemoteFileDP remoteFile的重载方法。
因此,如果我可以采用如下字符串值:
string locationDirectory;
Run Code Online (Sandbox Code Playgroud)
它是从另一个方法传入的,然后具有类似于以下内容的内容:
RemoteFileDP remoteFile = locationDirectory;
Run Code Online (Sandbox Code Playgroud)
那么使用remoteFile 的所有其他方法将不必重载或更改。
抱歉所有细节,但这是我第一次发帖,所以我希望我提供了足够的信息。我确实查看了C# 将动态字符串转换为现有类和C#:使用运行时确定的类型实例化对象并编写了以下代码:
RemoteFilesDP remoteFile = (RemoteFileDP)Activator.CreateInstance(typeof(RemoteFileDP), locationDirectory);
Run Code Online (Sandbox Code Playgroud)
但是,我不断收到“MissingMethodException”错误,表示找不到 RemoteFileDP 的构造函数,但我确实有构造函数,如下所示:
public RemoteFileDP()
{
} //end of RemoteFilePlattsDP constructor
Run Code Online (Sandbox Code Playgroud)
提前感谢您的帮助!