vendredi 25 août 2023

Create a Dictionary using reflection from a property of a parent class using refleciton [duplicate]

I am trying to make a reference class creator. I it mostly working but dictionary I have run into some issues.

The problem is I have methods like:

static Dictionary<TKey, TVal> GetDictionary<TKey, TVal>(Type type1, Type type2)
{
    var v1 = GetGeneric<TKey>(type1);
    var v2 = GetGeneric<TVal>(type2);

    return new Dictionary<TKey, TVal> { { v1, v2 } };
}

static T GetGeneric<T>(Type t)
{
    if (t == typeof(string))
        return (T)(object)" ";

    if (t == typeof(int) || t == typeof(long) || t == typeof(float) || t == typeof(decimal))
        return (T)(object)0;

    return (T)(object)null;
}

This can be called on a PropertyInfo object info on a parent class like so:

if (p.PropertyType.Name == "Dictionary`2")
{
    var t1 = p.PropertyType.GenericTypeArguments[0];
    var t2 = p.PropertyType.GenericTypeArguments[1];
    var ty1 = t1.BaseType;

    
    //Kind of defeats the point here.  If I make args use TKey, TVal then it blows up on casting to TKey, TVal...
    var d = GetDictionary<string, string>(t1, t2);
    p.SetValue(obj, d);
}

However you can see I had to set the types as they cannot gather them except explicitly. I have messed with changing the types to use Activator as well as trying expressions and such.

Ultimate the goal is to make a tool that can just make base types with defaults for many differing classes. I don't have to use reflection I just thought it would be the easiest way to do this. I can use .NET 6 so if there are newer syntax to do this, that would be prefered. I saw a lot of older code doing this here.

The duplicate suggested from what I gather I appreciate but I am not certain that is what I want. In this example you would make method to make calls to generics. I want to be able to do:

Dictionary<string, int> Dictionary<int, string> Dictionary<string, string> Dictionary<int, DateTime>

From reflection and make defaults. I have done other pieces but I am not certain if this would do much beyond make me make more methods to do this. I currently am just returning an object currently with types as my interim solution and just adding each case as they come up. But I was curious if I could do this at runtime easier.

This:

Type d1 = typeof(Dictionary<,>);
Type[] typeArgs = { p.PropertyType.GenericTypeArguments[0], p.PropertyType.GenericTypeArguments[1] };
Type constructed = d1.MakeGenericType(typeArgs);
object o = Activator.CreateInstance(constructed);
p.SetValue(obj, o);

Works for what I need. I just need to populate defaults.





Aucun commentaire:

Enregistrer un commentaire