2017-01-01 10 views
0

このようなジェネリックタイプを構築する方法はありますか?タイプから汎用タイプを構築するにはどうすればよいですか?

私はそれが不可能かもしれないことを知っています。回避策を取得するには:いくつかのプロパティの設定のためにデリゲートAction<T>を作成します。

var type = propertyInfo.PropertyType; 
var defaultVal = type.IsValueType ? Activator.CreateInstance(type) : null; 

var setter = (Action<object>)propertyInfo 
    .GetSetMethod(true) 
    .CreateDelegate(typeof(Action<object>), this); 

var resetter = new Action(() => setter(defaultVal)); 
return resetter; 

これは機能しません。正確に一致する型を渡さなければならないからです。プロパティーセッターが2倍の場合、私はAction<double>を渡さなければなりません。

私はジェネリックコンテナタイプと基本タイプを手元に持っています。どうすればそれらを混ぜることができますか?私はグループクラスから取られたプロパティのに取り組んでいます


注意。 ではない単一のプロパティ。

var props = GetType().GetProperties(Flags); 

答えて

2

あなたはType.MakeGenericTypeを使用することができます:あなたはその後、デリゲートを作成することができます

Type underlyingType = propertyInfo.PropertyType; 
Type genericType = typeof(Action<>).MakeGenericType(underlyingType); 

(あなたがMethodInfoという名前targetMethodInfoを持っていると仮定します):

Delegate = Delegate.CreateDelegate(genericType, targetMethodInfo); 
+0

非常にきれいなアプローチを。私はそれを自分自身の質問に答えるので、答えとしてマークします。 (今、私は 'DynamicInvoke'のほうが良いか' SetValue'か、もっと良い方法があるということを念頭に置いて質問しています) –

0

私はDynamicInvokeを呼んだし、どのような方法が遅いように思わどのようにこれまで、この操作を行うことができました。

var ptype = propertyInfo.PropertyType; 
var defaultVal = ptype.IsValueType ? Activator.CreateInstance(ptype) : null; 
var type = Type.GetType($"System.Action`1[{ptype}]"); 
var setter = prop.GetSetMethod(true).CreateDelegate(type, this); 
var resetter = new Action(() => setter.DynamicInvoke(defaultVal)); 
return resetter; 

だから多分このアプローチが優れています。

var ptype = propertyInfo.PropertyType; 
var defaultVal = ptype.IsValueType ? Activator.CreateInstance(ptype) : null; 
var resetter = new Action(() => propertyInfo.SetValue(this, defaultVal)); 
関連する問題