0

我正在开发一个向设备发送命令的项目。每个命令对象与设备支持的特定命令(由支持的 dll 的 API 定义)具有一对一的关系。

我有定义命令的 XML 文件:命名方法名称和参数(按名称、类型和默认值)。

我的应用程序读取 XML 并创建一个命令对象。我有一个参数字典,其中的参数名称与值相关联(按类型)。

在填充参数字典时,我开始创建一个类型,然后是一个实例,然后更新字典。

{
    theType = Type.GetType(paramType);
    var newInstance = Activator.CreateInstance(theType, true);
    parameterValueMap.Add(paramName, newInstance);
}

这适用于整数等,但不适用于字符串类型,因为它们没有无参数构造函数。

由于可能有其他类型的无参数构造函数,我需要保持解决方案的通用性(不专门处理字符串)。

有人可以帮我解决问题吗?有没有办法在没有参数的实际实例的情况下创建带参数的类型的实例(在我的具体情况下是字符串的实例)?

谢谢-m

4

2 回答 2

1

由于您提到泛型, adefault(T)可能有用,但这将null用于类/接口。一个方便的邪恶技巧是:

T obj = (T)FormatterServices.GetUninitializedObject(typeof(T));

然而!这是纯粹的邪恶,通常为反序列化/物化库保留。这不适用于临时使用。

也许最好的方法是让调用者告诉你如何,例如添加一个可选的工厂参数:

 void YourMethod<T>(..., Func<T> constructor = null)

然后,如果他们想要调用者可以提供一种技术来创建实例。所以你有了:

T obj = constructor == null ? (T)Activator.CreateInstance(typeof(T))
                            : constructor();

无论如何:字符串是一个大问题。毫无疑问,您将需要特殊情况的字符串。

于 2012-09-27T18:28:57.990 回答
0

Activator.CreateInstance(type, ParseKeys(ID).ToArray())我在我的代码中使用 a ,其中ID||键/值对的单独列表,并且ParseKeys()

    private static IEnumerable<object> ParseKeys(string keyString)
    {
        IEnumerable<string> keyStrings = keyString.Split(new string[] { "||" }, StringSplitOptions.RemoveEmptyEntries); // Use this construction to enable splitting on multiple characters
        List<object> keys = new List<object>();
        foreach (var key in keyStrings)
        {
            var type = Type.GetType(key.Split("|")[0]);
            var value = key.Split("|")[1];
            var data = Convert.ChangeType(value, type);
            keys.Add(data);
        }
        return keys;
    }

显然,您需要能够以某种形式将参数表示为字符串,而且我还没有针对无参数构造函数对其进行测试,但它对整数和字符串都适用。

于 2012-09-27T18:34:51.597 回答