0

我的网页的后端必须根据它在查询字符串中接收到的值加载不同的类。我需要一种方法来确保所有其他必要的参数都存在,以便可以实例化该类。

这是一个精简的示例:

两个类,CarCycle继承自Vehicle.

Public Class Car
    Inherits Vehicle

    Private Const _wheels as Int = 4
    Private _transmission as string
    Private _mpg as int

    Public Sub New(Byval transmission as string, Byval mpg as int)
        _transmission = transmission
        _mpg = mpg
    End Sub
End Class

Public Class Cycle
    Inherits Vehicle

    Private Const _wheels as Int = 2
    Private _gears as Int

    Public Sub New(ByVal gears as Int)
        _gears = gears                
    End Sub
End Class

这是我的查询字符串:?type=car&transmission=automatic

所以我知道类型是什么,但我没有提供 mpg 详细信息,我需要能够实例化该类。

执行此操作的“手动”方法是解析查询字符串并编写如下内容:

if not string.isNullOrEmpty(transmission) and not string.isNullOrEmpty(mpg) then
    dim c as new Car(transmission, mpg)
end if

但是如果有很多参数,这可能会变得混乱。当你想编辑一个类对象时,它也更难维护。

我想获取类所需的每个参数的名称,并查看查询字符串中是否存在该名称。但是,我显然需要在实例化类之前执行此操作。我不确定这是否可能。

这是做到这一点的聪明方法吗?有没有比写出我需要检查是否存在的每个参数更聪明的方法?

这个问题中的代码是用 vb.net 编写的,但我很高兴用 C# 讨论答案

4

2 回答 2

2
var queryParams = HttpUtility.ParseQueryString("?type=car&transmission=automatic");

Type type = typeof(Car);

bool canCreate = type.GetConstructors()
                .Any(c => c.GetParameters().All(p => queryParams[p.Name] != null));

您甚至可以从查询字符串动态创建车辆对象。

var queryParams = HttpUtility.ParseQueryString("?type=car&transmission=automatic&mpg=12");

Dictionary<string, Type> types = new Dictionary<string, Type>()
{
    {"car",typeof(Car)},
    {"cycle",typeof(Cycle)}

};

Type vehicleType = types[queryParams["type"]];

var cInfo = vehicleType.GetConstructors()
        .FirstOrDefault(c => c.GetParameters().All(p => queryParams[p.Name] != null));

if (cInfo != null)
{
    var cParams=  cInfo.GetParameters()
                        .Select(p => Convert.ChangeType(queryParams[p.Name], p.ParameterType))
                        .ToArray();

    object vehicle = Activator.CreateInstance(vehicleType, cParams);
}
于 2012-10-11T14:55:03.863 回答
1

也许您可以尝试使用 Activator 对象?像这样的东西(C#):

(T)Activator.CreateInstance(typeof(T), p1, p2); 

其中 T 是您的类型(汽车等)

然后,使您的类参数可选,但在 ctor 中测试它们是否为 null,如果它们是则抛出异常:

Public Sub New(Optional Byval transmission as string, Optional Byval mpg as int)    

if string.isNullOrEmpty(transmission) then
    throw exception ....
end if
    _transmission = transmission                 
    _mpg = mpg             
End Sub 

最后,处理异常并继续前进。只是一个想法...

于 2012-10-11T15:10:42.940 回答