Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将基类强制转换为T的泛型类_C#_Asp.net_Asp.net Mvc_Reflection - Fatal编程技术网

C# 将基类强制转换为T的泛型类

C# 将基类强制转换为T的泛型类,c#,asp.net,asp.net-mvc,reflection,C#,Asp.net,Asp.net Mvc,Reflection,我有一个名为Event的基类,它由名为RequestModel的泛型类类型继承。现在,我必须将基类对象转换为派生类,而不知道请求模型中的“T”类型。以下是我所做的事情。事先谢谢你的帮助 公共类请求模型:事件 { 公共Guid Id{get;set;} 公共T模型{get;set;} 公共字符串IpAddress{get;set;} 公共字符串EntityType=>typeof(T).ToString(); 公共重写类型RequestEntityType{get{return typeof(T)

我有一个名为Event的基类,它由名为RequestModel的泛型类类型继承。现在,我必须将基类对象转换为派生类,而不知道请求模型中的“T”类型。以下是我所做的事情。事先谢谢你的帮助

公共类请求模型:事件
{
公共Guid Id{get;set;}
公共T模型{get;set;}
公共字符串IpAddress{get;set;}
公共字符串EntityType=>typeof(T).ToString();
公共重写类型RequestEntityType{get{return typeof(T);}
公共UserDataViewModel用户数据{get;set;}
公共字符串Url{get;set;}
公共日期时间日志日期{get;set;}
公共请求模型()
{
Id=Guid.NewGuid();
}
}
公共抽象类事件
{
公共抽象类型RequestEntityType{get;}
}
我有一个事件类集合,我在其中添加了RequestModel

public List<Event> AllEvents = new List<Event>();
这里是MapData函数,其中是类型转换,我实际上需要将事件对象转换为RequestModel对象

private CreditCardLog MapData(Event request)
{
    var b = Activator.CreateInstance(request.RequestEntityType);
    var a = CastToMyType(b, request);

    var serializer = new JavaScriptSerializer();
    var returnData = new CreditCardLog()
    {
        AppraisalFormID = ApparisalId,
        CreatedBy =null ,
        CreatedDate = a.LogDate,
        LogID = a.Id,
        Data = serializer.Serialize(a.Model)
    };
    //return returnData;
    return returnData;
}

public  RequestModel<T> CastToMyType<T>(T NeededType, object givenObject) where T : class
{
    var newObject = givenObject as RequestModel<T>;
    return newObject;
}
private CreditCardLog映射数据(事件请求)
{
var b=Activator.CreateInstance(request.RequestEntityType);
var a=CastToMyType(b,请求);
var serializer=新的JavaScriptSerializer();
var returnData=new CreditCardLog()
{
评估形式=装置式,
CreatedBy=null,
CreatedDate=a.LogDate,
LogID=a.Id,
Data=serializer.Serialize(a.Model)
};
//返回数据;
返回数据;
}
public RequestModel CastToMyType(T NeededType,object givenObject),其中T:class
{
var newObject=givenObject作为RequestModel;
返回newObject;
}

最后一个函数
CastToMyType
是我迫切需要将对象强制转换为
RequestModel
类型的强制转换函数,我现在无法做到这一点,如果有人能帮忙,那就太好了。谢谢。

您可以通过反射调用您的方法

MethodInfo method = typeof(Example).GetMethod("CastToMyType");
MethodInfo generic = method.MakeGenericMethod(e.RequestEntityType);
generic.Invoke(this, new object[] { e.RequestEntityType, e });

请参见

您可以在RequestModel类的T模型中设置事件类列表,因为它是泛型类型

public class RequestModel<T>
{
    public Guid Id { get; set; }
    public T Model { get; set; }
    public string IpAddress { get; set; }
    public string Url { get; set; }
    public DateTime LogDate { get; set; }
    public RequestModel()
    {
        Id = Guid.NewGuid();
    }
}
公共类请求模型
{
公共Guid Id{get;set;}
公共T模型{get;set;}
公共字符串IpAddress{get;set;}
公共字符串Url{get;set;}
公共日期时间日志日期{get;set;}
公共请求模型()
{
Id=Guid.NewGuid();
}
}
现在定义可以记录事件的函数

public void LogEvent(RequestModel<List<Event>> request)
{
    foreach (var eventItem in request.Model)
    {
        try
        {
            var logData = new CreditCardLog()
            {
                AppraisalFormID = ApparisalId,
                CreatedBy = "UserID",
                CreatedDate = request.LogDate,
                LogID = Guid.NewGuid(),
                Data = new JavaScriptSerializer().Serialize(eventItem)
            };
            _creditCardLogService.Add(logData);
        }
        catch (Exception ex)
        {
            continue;
        }
    }
}
公共作废日志事件(请求模型请求)
{
foreach(request.Model中的var eventItem)
{
尝试
{
var logData=new CreditCardLog()
{
评估形式=装置式,
CreatedBy=“UserID”,
CreatedDate=request.LogDate,
LogID=Guid.NewGuid(),
Data=new JavaScriptSerializer().Serialize(eventItem)
};
_creditCardLogService.Add(日志数据);
}
捕获(例外情况除外)
{
继续;
}
}
}
要将模型转换为RequestModel,还可以创建一个扩展方法

public static RequestModel<T> ToRequestModel<T>(this T model)
{
    return new RequestModel<T>()
    {
        Id = Guid.NewGuid(),
        Model = model
        // assign other property value
    };
}
公共静态请求模型到请求模型(此T模型)
{
返回新的RequestModel()
{
Id=Guid.NewGuid(),
模型
//指定其他属性值
};
}
现在,您可以通过调用ToRequestModel方法将事件列表转换为RequestModel

List<Event> ev = new List<Event>();
var request = ev.ToRequestModel();
LogEvent(request);
List ev=new List();
var request=ev.ToRequestModel();
日志事件(请求);

此外,如果存在不同类型的事件,则应在这些事件类中继承抽象事件类,而不是RequestModel类。

JavaScriptSerializer
已过时,不应使用。ASP.NET Web API本身使用Json.NET。JavaScriptSerializer甚至没有使用事实日期标准ISO8601,这是一个严重的问题。在所有这些难以阅读的代码中,这是一件显而易见的事情。至于其余的,只发布相关代码,突出问题所在。现在,人们必须阅读所有内容才能理解你的要求。JavaScriptSerializer是最明显的problem@damonshahi至于转换,您不能将具体类型转换为泛型类型。强制转换不会改变对象,它允许您通过不同的接口使用它。如果您在编译时不知道确切的类型,为什么不提取一个非泛型基接口(所有泛型类都实现了该接口)并强制转换为该接口呢?否则,您就不能强制转换,因为强制转换是一种编译时操作,您只能在运行时知道实际的类型。使用接口会更快,并且避免分配,因为所有的反射开销都消失了。所有这些代码都可以简化为一个LINQ查询,例如
allEvents.OfType().Select(req=>newcreditcardlog{evalumatalformid=ApparisalId,CreatedDate=req.LogDate,LogID=req.Id,Data=JsonConvert.serializedObject(req.Model)}.ToList()
List<Event> ev = new List<Event>();
var request = ev.ToRequestModel();
LogEvent(request);