C# 基于另一个值创建类型参数

C# 基于另一个值创建类型参数,c#,generics,c#-4.0,enums,type-parameter,C#,Generics,C# 4.0,Enums,Type Parameter,我不知道以前是否有人问过这个问题,所以请给我指出另一个问题 我有一个这样的方法: private void SomeMethod<TLocation>(int x, int y) where TLocation : DataLocation { // } 数据位置的类型: DataCountry DataState DataCounty DataCity DataNeighborhood DataStreet 知道类型参数是“Data”+enum name,有什么方法可以动

我不知道以前是否有人问过这个问题,所以请给我指出另一个问题

我有一个这样的方法:

private void SomeMethod<TLocation>(int x, int y) where TLocation : DataLocation
{
   //
}
数据位置的类型:

DataCountry
DataState
DataCounty
DataCity
DataNeighborhood
DataStreet
知道类型参数是“Data”+enum name,有什么方法可以动态调用我的方法吗

或者我应该坚持:

switch (locationType)
{
   case LocationType.Country: 
      SomeMethod<DataCountry>(1, 2);
      break;
   case LocationType.State:
      SomeMethod<DataState>(2, 4);
      break;
   // etc
}
开关(位置类型)
{
案例位置类型。国家/地区:
方法(1,2);
打破
案例位置类型。状态:
方法(2,4);
打破
//等
}
编辑:


看来反射是唯一的方法。我将坚持使用switch语句。

我认为您应该坚持您建议使用switch语句的实现。它清晰、简洁,而且我不知道如何动态地实现它。

我认为您应该坚持使用switch语句建议的实现。它清晰、简洁,而且我不知道如何动态地完成它。

您始终可以重构开关外壳,并将特定于外壳的代码放在单独的函数中。这是一篇很好的文章-

你可以重构你的开关外壳,并将特定于外壳的代码放在不同的函数中。这是一篇很好的文章-

听起来这个方法应该被定义为DataState类的一个成员,并相应地被重写,可能是内部使用
this.GetType()
。你在这里滥用仿制药

也就是说。。。(我几乎希望我在这方面被否决……)

使用系统;
利用制度全球化;
使用System.Linq;
运用系统反思;
命名空间控制台应用程序1
{
班级计划
{
静态void Main(字符串[]参数)
{
new ResolveIt().InvokeIt(LocationType.State,1,5);
Console.ReadLine();
}
}
很遗憾,公共类ResolveIt//无法约束枚举
{
私有静态只读操作[]操作
=Enum.GetValues(typeof(TEnum))
.Cast()
.选择(v=>typeof(ResolveIt)
.GetMethods(BindingFlags.NonPublic | BindingFlags.Static)
.First(n=>n.Name==“SomeMethod”)
.GetGenericMethodDefinition()
.MakeGenericMethod(新[]{Type.GetType(typeof(ResolveIt).Namespace+“.Data”+Enum.GetName(typeof(TEnum,v))}))
.Select(mi=>(操作)委托.CreateDelegate(操作类型,mi))
.ToArray();
公共void InvokeIt(TEnum类型,int x,int y)
{
动作[(Int32)Convert.ChangeType(type,typeof(Int32))](x,y);
}
私有静态方法(intx,inty),其中TLocation:DataLocation
{
控制台输出写入线(类型(位置));
}
}
公共枚举位置类型{国家、州、城市、邮政编码,}
公共类数据位置{}
公共类DataCountry:DataLocation{}
公共类数据状态:数据位置{}
公共类DataCity:DataLocation{}
公共类DataZip:DataLocation{}
}

听起来这个方法应该被定义为DataState类的成员,并相应地被重写,可能是通过内部使用
this.GetType()
。你在这里滥用仿制药

也就是说。。。(我几乎希望我在这方面被否决……)

使用系统;
利用制度全球化;
使用System.Linq;
运用系统反思;
命名空间控制台应用程序1
{
班级计划
{
静态void Main(字符串[]参数)
{
new ResolveIt().InvokeIt(LocationType.State,1,5);
Console.ReadLine();
}
}
很遗憾,公共类ResolveIt//无法约束枚举
{
私有静态只读操作[]操作
=Enum.GetValues(typeof(TEnum))
.Cast()
.选择(v=>typeof(ResolveIt)
.GetMethods(BindingFlags.NonPublic | BindingFlags.Static)
.First(n=>n.Name==“SomeMethod”)
.GetGenericMethodDefinition()
.MakeGenericMethod(新[]{Type.GetType(typeof(ResolveIt).Namespace+“.Data”+Enum.GetName(typeof(TEnum,v))}))
.Select(mi=>(操作)委托.CreateDelegate(操作类型,mi))
.ToArray();
公共void InvokeIt(TEnum类型,int x,int y)
{
动作[(Int32)Convert.ChangeType(type,typeof(Int32))](x,y);
}
私有静态方法(intx,inty),其中TLocation:DataLocation
{
控制台输出写入线(类型(位置));
}
}
公共枚举位置类型{国家、州、城市、邮政编码,}
公共类数据位置{}
公共类DataCountry:DataLocation{}
公共类数据状态:数据位置{}
公共类DataCity:DataLocation{}
公共类DataZip:DataLocation{}
}

以下是可能的解决方案:

var dispatches = new Dictionary<LocationType, Action<int, int>>();
dispatches.Add(LocationType.Country, SomeMethod<DataCountry>);
dispatches.Add(LocationType.State, SomeMethod<DataState>);
//... and etc.

dispatches[LocationType.Country](1, 2); // the same as SomeMethod<DataCountry>(1,2)
var dispatches=newdictionary();
dispatches.Add(LocationType.Country,SomeMethod);
dispatches.Add(LocationType.State,SomeMethod);
//... 等等。
派遣[地点类型.国家](1,2);//与方法(1,2)相同

以下是可能的解决方案:

var dispatches = new Dictionary<LocationType, Action<int, int>>();
dispatches.Add(LocationType.Country, SomeMethod<DataCountry>);
dispatches.Add(LocationType.State, SomeMethod<DataState>);
//... and etc.

dispatches[LocationType.Country](1, 2); // the same as SomeMethod<DataCountry>(1,2)
var dispatches=newdictionary();
dispatches.Add(LocationType.Country,SomeMethod);
dispatches.Add(LocationType.State,SomeMethod);
//... 等等。
派遣[地点类型.国家](1,2);//与方法(1,2)相同

肯定有办法
MakeGenericType
?肯定有办法
MakeGenericType
?通常这表示
SomeMethod
应该是其他数据类型上的虚拟方法。但是,如果不看你的实际等级制度,就很难知道:)@Porges-是的,我知道。:)这是一个ASP.NET MVC应用程序,
SomeMethod
实际上是一个特定于UI的方法(设置ViewModel),因此它不属于域(位置信息)。通常这表明
SomeMethod
应该是som上的虚拟方法
var dispatches = new Dictionary<LocationType, Action<int, int>>();
dispatches.Add(LocationType.Country, SomeMethod<DataCountry>);
dispatches.Add(LocationType.State, SomeMethod<DataState>);
//... and etc.

dispatches[LocationType.Country](1, 2); // the same as SomeMethod<DataCountry>(1,2)