2016-11-12 2 views
2

У меня есть этот кусок кода в моем приложении C#:C# - Как использовать анонимные типы с Dotfuscator.Net?

JObject personJson = JObject.FromObject(
    new 
    { 
     name = "John Doe", 
     age = 34, 
     height = 1.78, 
     weight = 79.34 
    }); 

Console.WriteLine(person); 

И он записывает:

{ 
    "name": "John Doe", 
    "age": 34, 
    "height": 1.78, 
    "weight": 79.34 
} 

И Dotfuscater запутывает его к этому:

Console.WriteLine((object) JObject.FromObject((object) new global::b<string, int, double, double>("John Doe", 34, 1.78, 79.34))); 

И тогда выход заключается в следующем:

{} 

Как я могу использовать анонимные классы с Dotfuscator без этой проблемы?

EDIT:

Полный код:

public static class Example 
{ 
    static void LogPerson() 
    { 
     JObject personJson = JObject.FromObject(
      new 
      { 
       name = "John Doe", 
       age = 34, 
       height = 1.78, 
       weight = 79.34 
      }); 
     Console.WriteLine(JSONObject); 
    } 
} 

ответ

1

You/Я мог бы использовать динамический объект, например:

dynamic person = new ExpandoObject(); 
person.name = "John Doe"; 
person.age = 34; 
person.height = 1.78; 
person.weight = 79.34; 

JObject personJson = JObject.FromObject(person); 

Console.WriteLine(personJson); 

Это выглядит очень странно, когда он запутывается, но он работает. Вывод точно такой, как ожидалось.

+0

@UUioP, спасибо мне большое! Именно то, что я хотел. – UUioP

1

Я вижу, что никто не ответил на свой пост, так что я ответил бы с некоторыми мыслями. Вы, наверное, уже знаете это, поэтому я заранее извиняюсь.

Во-первых, я вижу, что из запутанного кода возвращаемый объект от JObject.FromObject отливается к типу object. Помните, что если вы передадите любую ссылку на объект на метод Console.WriteLine, будет вызван метод объекта по умолчанию ToString. Следовательно, в вашем примере вызывается метод Object.ToString(). Из MSDN документации Object.ToString() она гласит:

по умолчанию реализации метода Object.ToString вернуть полное имя типа объекта.

Я бы сказал, что ваше использование анонимного типа путает вещи так, как я не знаю; но вы могли бы написать собственный способ расширения ToString для типа JObject? Может быть, что-то похожее на:

public static class Extensions 
{ 
    public static string ToJSONString(this JObject jo) 
    { 
     // You could step into this method in the VS debugger to 
     // see what 'jo' looks like. You may have to use reflection 
     // to get at the properties, but I've never tried it on an 
     // anonymous type. 
    } 
} 

Вы бы затем вызвать Console.WriteLine(JSONObject.ToJSONString()); BTW, использование JSONObject в качестве имени переменной меня смущает, потому что это выглядит как Type; не могли бы вы вместо этого использовать jsonObject?

Я надеюсь, что кто-то еще может прояснить ситуацию немного больше. Удачи!

+0

'JObject' не является анонимным типом, а' ToString' является виртуальным методом. Проблема в том, что dotFuscator превращает анонимный объект (из которого построен JObject) в общий вспомогательный общий класс, избавляясь от всех имен свойств; отражение не может помочь вам - вот что использует «JObject.FromObject». – Luaan

+0

Спасибо за информацию. У меня была догадка, что мой пост может вызвать некоторые ответы. Я сказал, что ступаю в неизведанные воды. Вы говорите, что метод расширения не будет работать, и есть ли у вас какие-либо дополнительные предложения для UUioP? – RETierney

+0

Боюсь, что нет другого выхода, кроме конфигурации dotFuscator, и я понятия не имею, какие варианты дают вам, к сожалению :) – Luaan

1

Похоже, что Dotfuscator удаляет свойства, даже если вы этого не хотите. (Это делает это, потому что обычно это безвредно, и это затрудняет обратное проектирование.) Вы должны уметь исключать эти свойства из переименования, что предотвратит их удаление, путем настройки правила исключения, которое соответствует CompilerGeneratedAttribute. Это предотвратит удаление всех таких свойств на анонимных классах.

Вот пример файла проекта (сегмента), что бы это сделать:

<excludelist> 
    <type name=".*" regex="true" excludetype="false"> 
    <customattribute name=".*CompilerGeneratedAttribute" regex="true" /> 
    <propertymember name=".*" regex="true" /> 
    </type> 
</excludelist> 

Вы можете прочитать о том, как сделать это с помощью графического интерфейса пользователя в Community Edition docs или Pro docs.

Полное раскрытие информации: Я работаю в PreEmptive Solutions.

+0

Спасибо! но можете ли вы, пожалуйста, дать мне более конкретный пример моей ситуации? У Dotfuscator нет большого опыта. – UUioP

+0

Вы используете Community Edition или Professional? –

+0

Community Edition – UUioP

Смежные вопросы