C# 使用接口,但保留具体值

C# 使用接口,但保留具体值,c#,interface,C#,Interface,我试图创建一个与接口列表一起工作的函数,但我希望保留这些列表的具体类值。例如: public interface GUID_OBJECT { string GUID { get; set; } } public class Car : GUID_OBJECT { public string GUID { get; set; } public string CarSpecifikProp { get; set; } } public class Bike : GUID_

我试图创建一个与接口列表一起工作的函数,但我希望保留这些列表的具体类值。例如:

public interface GUID_OBJECT
{
    string GUID { get; set; }
}

public class Car : GUID_OBJECT
{
    public string GUID { get; set; }
    public string CarSpecifikProp { get; set; }
}

public class Bike : GUID_OBJECT
{
    public string GUID { get; set; }
    public string BikeSpecifikProp { get; set; }
}
类程序
{
静态void Main(字符串[]参数)
{
var cars=new List(){new Car(){GUID=“1”,CarSpecifikProp=“carstuff”},new Car(){GUID=“2”,CarSpecifikProp=“carsuff”};
var bikes=new List(){new Bike(){GUID=“1”,BikeSpecifikProp=“bikestuff”},new Bike(){GUID=“2”,BikeSpecifikProp=“bikestuff”};
var filteredCars=FilterGuidObjects(汽车);
foreach(过滤车中的var车)
{
car.CarSpecifikProp=“更改此”;
}
var filteredBikes=FilterGuidObjects(自行车);
foreach(过滤袋中的var自行车)
{
bike.BikeSpecifikProp=“更改此”;
}
Console.ReadKey();
}
静态列表过滤器guidobjects(列表对象)
{
返回objects.Where(x=>x.GUID==“1”).ToList();
}
}

这段代码不起作用,但它说明了我想做什么。我有一个web api项目,它返回各种类型的对象列表,但所有这些对象都有一些共同点,例如
GUID
。我是否可以编写与接口
GUID\u对象
一起工作的函数,但在该函数返回其
GUID\u对象
接口列表后保留
Car
Bike
特定属性?您将如何处理这样的场景?

制作一个带有约束的通用方法:

static List<G> FilterGuidObjects<G>(List<G> objects) where G: GUID_OBJECT
{
    return objects.Where(x => x.GUID == "1").ToList();
}
静态列表过滤器guidobjects(列表对象),其中G:GUID\u对象
{
返回objects.Where(x=>x.GUID==“1”).ToList();
}

接口的要点是只具有实现它们的类的公共属性。如果需要使用特定属性,则需要强制转换为所需的类型:

var obj = (MyType) myInterface
由于您使用的是列表,因此可以按如下方式强制转换整个列表:

listOfInterface.Cast<MyType>().ToList()
listOfInterface.Cast().ToList()

考虑将FilterGuidObject实现为一个通用函数:

        static List<T> FilterGuidObjects<T>(List<T> objects) where T : GUID_OBJECT
        {
            return objects.Where(x => x.GUID == "1").ToList();
        }
静态列表过滤器guidobjects(列表对象),其中T:GUID\u对象
{
返回objects.Where(x=>x.GUID==“1”).ToList();
}

实现这一点的方法有很多,但关键是必须将接口转换回原始类型

方法1:函数上的泛型筛选器

static List<T> FilterGuidObjects(List<T> objects)
    :where T:GUID_OBJECT
{
    return objects.Where(x => x.GUID == "1").ToList();
}

Pros不使用泛型
Con需要大量代码

这些代码不是“GUID”,使用接口作为不同类型类的接口不会破坏非接口值,您只需重新转换它们以访问它们,我建议使用var obj=myInterface作为MyType。也可以使用类型而不是强制转换,因为如果类型不正确,则不会出错
static List<T> FilterGuidObjects(List<T> objects)
    :where T:GUID_OBJECT
{
    return objects.Where(x => x.GUID == "1").ToList();
}
var filteredCars = FilterGuidObjects(MixedListOfVechiles).OfType<Car>();
var car = guid_object as Car
if(car != null)
    car.CarSpecifikProp = "changethis";
if(guid_object is Car)
{
    var car = (Car)guid_object
    car.CarSpecifikProp = "changethis";
}