Js objects/values back to C# #1484
-
Follow up from #1479 I'm now trying the reverse, objects from Js/Jint back to C#, so from the So for example a Any ideas? Nuget packages inRiver.Remoting.iPMC and Jint.
I would've expected that the English text was using inRiver.Remoting.Objects;
using Jint;
using Jint.Native;
using Jint.Runtime.Interop;
using System.Globalization;
Engine jintEngine = new(o =>
{
//o.Interop.Enabled = true;
//o.Interop.TrackObjectWrapperIdentity = true;
o.AddObjectConverter<LocaleStringToJint>();
o.SetTypeConverter(jintEngine => new LocaleStringFromJint(jintEngine));
});
JsValue testFunction = jintEngine.Execute(
"""
function test(myEntity) {
myEntity.localeString['en'] = 'English filled by Jint';
}
""").GetValue("test");
LocaleString localeString = new();
localeString[new CultureInfo("en")] = "English Text";
localeString[new CultureInfo("nl")] = "Nederlandse tekst";
MyEntity myEntity = new()
{
LocaleString = localeString
};
Console.WriteLine($"Value before: {myEntity.LocaleString[new CultureInfo("en")]}");
JsValue jsValue = jintEngine.Invoke(testFunction, myEntity);
// I've expected "English filled by Jint"
Console.WriteLine($"Value after: {myEntity.LocaleString[new CultureInfo("en")]}");
Console.ReadKey();
public class MyEntity
{
public LocaleString LocaleString { get; set; }
}
public class ExternalLocaleString : LocaleString
{
private List<CultureInfo> _languages;
public ExternalLocaleString(LocaleString localeString)
{
_languages = localeString.Languages;
foreach (CultureInfo language in _languages)
{
base[language] = localeString[language];
}
}
public string this[string languageCode]
{
get {
CultureInfo cultureInfo = new(languageCode);
if (ContainsCulture(cultureInfo))
{
return base[cultureInfo];
}
return null;
}
set {
CultureInfo cultureInfo = new(languageCode);
base[cultureInfo] = value;
}
}
}
public class LocaleStringToJint : IObjectConverter
{
public bool TryConvert(Engine engine, object value, out JsValue result)
{
Console.WriteLine($"IN TryConvert. {value.GetType().FullName} {value}");
if (!(value is LocaleString localeString and not ExternalLocaleString))
{
result = null;
return false;
}
result = JsValue.FromObject(engine, new ExternalLocaleString(localeString));
return true;
}
}
public class LocaleStringFromJint : DefaultTypeConverter
{
public LocaleStringFromJint(Engine engine) : base(engine) { }
public override object Convert(object value, Type type, IFormatProvider formatProvider)
{
Console.WriteLine($"OUT Convert. {type.FullName} {value}");
if (type == typeof(ExternalLocaleString))
{
return (LocaleString)value;
}
return base.Convert(value, type, formatProvider);
}
public override bool TryConvert(object value, Type type, IFormatProvider formatProvider, out object converted)
{
Console.WriteLine($"OUT TryConvert. {type.FullName} {value}");
if (type == typeof(ExternalLocaleString))
{
converted = (LocaleString)value;
return true;
}
return base.TryConvert(value, type, formatProvider, out converted);
}
} |
Beta Was this translation helpful? Give feedback.
Replies: 1 comment 2 replies
-
Let's make an equivalent of namespace
|
Beta Was this translation helpful? Give feedback.
Let's make an equivalent of
inRiver.Remoting.Objects.LocaleString
so we don't need to pull in another binary.namespace
External