Reputation: 107
As you saw from the title, I need convert this object:
object obj = new{
Id = 1,
Name = "Patrick"
};
To specific class instance.
To be more clear, here is an example for you guys:
public class Student
{
public int Id { get; set; }
public string Name { get; set; }
}
public class Scholar
{
public int UniqueId { get; set; }
public string FullName { get; set; }
}
I have two classes Student and Scholar. I cant figure out a way to properly write an algorithm of conversion to specific type.
In my opinion, pseudo code should look like this :
if (obj.CanBeConverted<Student>()) {
//should return this if statement
obj = ConvertToType<Student>(o);
// after this method obj type should change to Student
} else if (obj.CanBeConverted<Scholar>()) {
//at current example wont reach this place
obj = ConvertToType<Scholar>(o);
// after this method obj type should change to Scholar
}
It this possible to program in some way ?
I surfed the net and found this example : https://stackoverflow.com/a/17322347/8607147
However this solution always tries to convert / deserialize object or dynamic type to concrete object.
Upvotes: 8
Views: 12772
Reputation: 1528
You can do it by using Json.Net Schema and Json.Net, check bellow how I did it:
class Program
{
static void Main(string[] args)
{
var o = new
{
Id = 1,
Name = "Patrick",
Courses = new[] { new { Id = 1, Name = "C#" } }
};
Student student = null;
Scholar scholar = null;
if (o.CanBeConverted<Student>())
student = o.ConvertToType<Student>();
else if (o.CanBeConverted<Scholar>())
scholar = o.ConvertToType<Scholar>();
System.Console.WriteLine(student?.ToString());
System.Console.WriteLine(scholar?.ToString());
System.Console.ReadKey();
}
}
public static class ObjectExtensions
{
public static bool CanBeConverted<T>(this object value) where T : class
{
var jsonData = JsonConvert.SerializeObject(value);
var generator = new JSchemaGenerator();
var parsedSchema = generator.Generate(typeof(T));
var jObject = JObject.Parse(jsonData);
return jObject.IsValid(parsedSchema);
}
public static T ConvertToType<T>(this object value) where T : class
{
var jsonData = JsonConvert.SerializeObject(value);
return JsonConvert.DeserializeObject<T>(jsonData);
}
}
public class Student
{
public int Id { get; set; }
public string Name { get; set; }
public Courses[] Courses { get; set; }
public override string ToString()
{
return $"{Id} - {Name} - Courses: {(Courses != null ? String.Join(",", Courses.Select(a => a.ToString())) : String.Empty)}";
}
}
public class Courses
{
public int Id { get; set; }
public string Name { get; set; }
public override string ToString()
{
return $"{Id} - {Name}";
}
}
public class Scholar
{
public int UniqueId { get; set; }
public string FullName { get; set; }
public override string ToString()
{
return $"{UniqueId} - {FullName}";
}
}
The solution is basically by generating a JSON Schema from your desired object and check if the new data que fit this shema.
Upvotes: 11