Я пытаюсь сделать это:
Type type = Type.GetType(string.Format("Gestor.Data.Entities.{0}, Gestor.Data", e.Item.Value));
MetaDataUtil.GetColumnasGrid<type>();
но он не работает, вы хоть представляете, как я могу это сделать?
Я пытаюсь сделать это:
Type type = Type.GetType(string.Format("Gestor.Data.Entities.{0}, Gestor.Data", e.Item.Value));
MetaDataUtil.GetColumnasGrid<type>();
но он не работает, вы хоть представляете, как я могу это сделать?
Для этого нужно использовать отражение.
var method =
typeof(MetaDataUtil)
.GetMethod("GetColumnasGrid")
.MakeGenericMethod(new [] { type })
.Invoke(null, null);
Если это метод экземпляра вместо статического метода, то вы передаете переменную Invoke (второй параметр null для массива параметров, который вы обычно передаете методу, в случае null - это как вызов метод без параметров .GetColumnAsGrid()
):
Type genericTypeParameter = Type.GetType(string.Format("Gestor.Data.Entities.{0}, Gestor.Data", e.Item.Value));
MetaDataUtil someInstance = new MetaDataUtil();
var returnResult =
typeof(MetaDataUtil)
.GetMethod("GetColumnsAsGrid")
.MakeGenericMethod(new [] { genericTypeParameter })
.Invoke(someInstance, null);//passing someInstance here because we want to call someInstance.GetColumnsAsGrid<...>()
Если у вас есть неоднозначное исключение перегрузки, вероятно, потому, что GetMethod обнаружил более одного метода с этим именем. В этом случае вместо этого вы можете использовать GetMethods и использовать критерии для фильтрации вниз до требуемого метода. Это может быть довольно хрупким, потому что кто-то может добавить другой метод, достаточно похожий на ваши критерии, который затем разбивает ваш код, когда он возвращает несколько методов:
var returnResult =
typeof(MetaDataUtil)
.GetMethods().Single( m=> m.Name == "GetColumnsAsGrid" && m.IsGenericMethod
&& m.GetParameters().Count() == 0 //the overload that takes 0 parameters i.e. SomeMethod()
&& m.GetGenericArguments().Count() == 1 //the overload like SomeMethod<OnlyOneGenericParam>()
)
.MakeGenericMethod(new [] { genericTypeParameter })
.Invoke(someInstance, null);
Это не идеально, потому что вы все еще можете иметь некоторую двусмысленность. Я только проверяю счет, и вам действительно нужно перебирать GetParameters и GetGenericArguments и проверять каждый, чтобы убедиться, что он соответствует подписи, которую вы хотите.