C# dotnetcore-需要创建一个泛型扩展方法,该方法有两个泛型,一个是扩展

C# dotnetcore-需要创建一个泛型扩展方法,该方法有两个泛型,一个是扩展,c#,.net-core,entity-framework-core,C#,.net Core,Entity Framework Core,我正在尝试创建一个通用的CSV转换静态方法。它具有实体-扩展。。让它成为“T”,但是我还需要基于实体包含不同的上下文。有两个数据库,每个数据库都有一个郊区实体和DBs上下文 我怎么会有两个泛型变量,其中一个是扩展。。 这是我开始的: public static Suburb FromCsv(string csvLine, CATALOGContext context) { if (csvLine == null) throw new ArgumentNullExc

我正在尝试创建一个通用的CSV转换静态方法。它具有实体-扩展。。让它成为“T”,但是我还需要基于实体包含不同的上下文。有两个数据库,每个数据库都有一个郊区实体和DBs上下文

我怎么会有两个泛型变量,其中一个是扩展。。 这是我开始的:

    public static Suburb FromCsv(string csvLine, CATALOGContext context)
    {
        if (csvLine == null) throw new ArgumentNullException(nameof(csvLine));
        if (context == null) throw new ArgumentNullException(nameof(context));

        var values = csvLine.Split(',');
        if (context.States == null) return null;
        if (values.Length <= 3) return null;
        var suburb = new Suburb
        {
            PostCode = values[0],
            SuburbName = values[1],
            State = context.States.FirstOrDefault(s => s.StateShortName == values[2]),
            Latitude = Convert.ToDouble(values[3], CultureInfo.CurrentCulture),
            Longitude = Convert.ToDouble(values[4], CultureInfo.CurrentCulture)
        };

        return suburb;
    }
publicsv(字符串csvLine,CATALOGContext)
{
如果(csvLine==null)抛出新的ArgumentNullException(nameof(csvLine));
如果(context==null)抛出新的ArgumentNullException(nameof(context));
var值=csvLine.Split(',');
if(context.States==null)返回null;
如果(values.Length s.StateShortName==值[2]),
纬度=Convert.ToDouble(值[3],CultureInfo.CurrentCulture),
经度=Convert.ToDouble(值[4],CultureInfo.CurrentCulture)
};
返回郊区;
}
这是我所拥有的,但显然是不对的

        public static T FromCsv<T, I>(this T source, string csvLine, I context)
        {
            if (csvLine == null) throw new ArgumentNullException(nameof(csvLine));
            if (context == null) throw new ArgumentNullException(nameof(context));

            var values = csvLine.Split(',');
            if (context.States == null) return null;
            if (values.Length <= 3) return null;
            var suburb = new Suburb
            {
                PostCode = values[0],
                SuburbName = values[1],
                State = context.States.FirstOrDefault(s => s.StateShortName == values[2]),
                Latitude = Convert.ToDouble(values[3], CultureInfo.CurrentCulture),
                Longitude = Convert.ToDouble(values[4], CultureInfo.CurrentCulture)
            };

            return suburb;
        }
public static T FromCsv(此T源代码,字符串csvLine,I上下文)
{
如果(csvLine==null)抛出新的ArgumentNullException(nameof(csvLine));
如果(context==null)抛出新的ArgumentNullException(nameof(context));
var值=csvLine.Split(',');
if(context.States==null)返回null;
如果(values.Length s.StateShortName==值[2]),
纬度=Convert.ToDouble(值[3],CultureInfo.CurrentCulture),
经度=Convert.ToDouble(值[4],CultureInfo.CurrentCulture)
};
返回郊区;
}
它不知道这是一个dbContext(context),所以我需要使用where子句,我不确定如何做到这一点。此外,每个dbContext都有一个“状态”,但由于上述原因,这是一个错误——不知道它是一个上下文


我怎么可以有多个泛型,其中一个是扩展-实体,另一个是上下文(我甚至不确定是否可以有),您可以将其用于不同的数据库上下文等?

您不能使用特定的实体返回T。您必须使用T返回T。为什么不使用这个简单的泛型

public enum DBcon
{
      DB1, DB2
}
public static Suburb FromCsv(string csvLine, DBcon con)
{
    var context = con == DBcon.DB1 ? new CATALOGContext() : new DB2Context();

    if (csvLine == null) throw new ArgumentNullException(nameof(csvLine));
    if (context == null) throw new ArgumentNullException(nameof(context));

    var values = csvLine.Split(',');
    if (context.States == null) return null;
    if (values.Length <= 3) return null;
    var suburb = new Suburb
    {
        PostCode = values[0],
        SuburbName = values[1],
        State = context.States.FirstOrDefault(s => s.StateShortName == values[2]),
        Latitude = Convert.ToDouble(values[3], CultureInfo.CurrentCulture),
        Longitude = Convert.ToDouble(values[4], CultureInfo.CurrentCulture)
    };

    return suburb;
}
公共枚举DBcon
{
DB1,DB2
}
公共静态CSV(字符串csvLine、DBcon con)
{
var context=con==DBcon.DB1?新建CATALOGContext():新建DB2Context();
如果(csvLine==null)抛出新的ArgumentNullException(nameof(csvLine));
如果(context==null)抛出新的ArgumentNullException(nameof(context));
var值=csvLine.Split(',');
if(context.States==null)返回null;
如果(values.Length s.StateShortName==值[2]),
纬度=Convert.ToDouble(值[3],CultureInfo.CurrentCulture),
经度=Convert.ToDouble(值[4],CultureInfo.CurrentCulture)
};
返回郊区;
}

首先,返回您希望扩展方法使用的相同类型似乎不正确。在
郊区
的情况下,您必须拥有它的一个实例才能调用扩展方法,然后它返回一个新实例?我不清楚那应该是什么。至于context参数,可以使用基本DbContext类型而不是泛型吗?
CATALOGContext
不是继承了DbContext吗?你能举一个例子说明你如何使用扩展方法吗?同样,如果泛型扩展方法不知道类型,它如何知道要设置哪些属性?或者哪些列映射到哪个属性?你研究过使用对象映射器吗?在我看来,这种方法负责太多的事情,比如拆分字符串、从数据库获取数据以及创建类的新实例。此外,将任何上下文传递给静态方法都是不好的做法。你有理由使用静态方法吗?这样就可以了。。。我对泛型不感兴趣,只是不想让它们中的两个几乎相同而已。所以谢谢你把这个贴出来。