编译器创建匿名类型:可破坏的行为

Compiler created anonymous types: breakable behavior

我有一些客户端 HTTP RESTfull 代码,这取决于 .net 编译器生成的匿名类型提供的舒适度。

匿名类型 example0 :

string prop_1 = "strValue1"; int prop_2 = 5; new { prop1 = prop_1, prop2 = prop_2};

匿名类型 example1 :

new { prop1 = "strValue1", prop2 = 5};

匿名类型示例2(同样有效):

string prop1 = "strValue1"; int prop2 = 5; new { prop1, prop2};

这里的问题是,编译器生成的匿名类型属性的名称通常很重要,不能重命名。具体来说,如果用户主动为匿名类型声明了一个 属性 名称,它可能表明该名称实际上很重要 - 即使在程序集之外 -

Dotfuscator 社区目前默认重命名匿名类型的属性。

此类问题领域之一是 "ad hoc" 构建 JSON 用于序列化和网络传输的对象。请参阅下面的代码。

这是一些代码,我在其中手动 assemble 用于 WebAPI 查询的 HTTP 消息内容。请求的正确性取决于确切的 属性 名称。匿名类型用于不必为每种类型的 HTTP WebAPI 查询声明新的-更新的类型。名称用户名、密码和 request_token 在应用程序外部很重要(对于 API 服务器)

string baseUrl = BASE_Address + BASE_Path + VALIDATE_REQUEST_TOKEN_W_LOGIN_Path;
var query = new Dictionary<string, string>();
query.Add(API_KEY_Key, _settings.ApiKey);
string requestUri = QueryHelpers.AddQueryString(baseUrl, query);
var jsonObj = new { username = username, password = password, request_token = requestToken };
string json = JsonConvert.SerializeObject(jsonObj);
var content = new StringContent(json, encoding: Encoding.UTF8, mediaType: "application/json");

预期行为: 如果 Dotfuscator 无法确定重命名匿名属性是否安全,则不应重命名。

考虑:

  1. 如果用户主动命名了匿名类型属性,那肯定是可疑的。请注意,执行 example0 而不是较短的 example2(见上文)的唯一原因是为了在 Visual Studio 中获得针对类型重命名的安全性。对于 example0,即使您重命名变量 prop_1 或 prop_2,它也不会破坏匿名类型名称,因此不会破坏生成的 Json 对象

  2. 如果方法或任何调用的子方法使用序列化而不是重命名 属性 肯定会破坏代码。 (因为序列化命名中的类型名称 Json 将取决于原始 属性 名称,因为没有用于序列化命名的用户声明属性)

现在的问题是:您能否向我推荐一些保留我当前代码但确保 Dotfuscator 不会重命名 method/anonymous 类型中的任何内容的属性或技巧?

注意:我以 Dotfuscator

开发人员的雇员的专业身份在此回答

Dotfuscator Community 自版本 5.34 起包含一个默认引用规则,用于从生成的匿名类型中排除属性。 (您可以从 here). Alternatively, you can define the rule 手动下载最新版本的 Dotfuscator 社区,即:

从包含自定义属性 System.Runtime.CompilerServices.CompilerGeneratedAttribute

的名为 .*AnonymousType.* 的类型中排除所有属性
<type name=".*AnonymousType.*" regex="true" excludetype="false">
    <customattribute name="System\.Runtime\.CompilerServices\.CompilerGeneratedAttribute" regex="true" />
    <propertymember name="*" regex="true" />
</type>