将base-type传递给方法

时间:2012-10-23 15:46:16

标签: c# oop inheritance

如果我有两个派生自基类的类,我怎样才能编写一个泛型方法,它可以操作两个类的继承属性,所以我不需要编写两个方法......

abstract class BaseClass
{
    public int Id { get; set; }
    public string slug { get; set; }
}

public class State:BaseClass
{
    public string StateName{ get; set; }
    public string Description { get; set; }
}

public class City:BaseClass
{
    public string TownName { get; set; }
    public string someOtherProperty{ get; set; }

}

“通用”方法:

public string Slugify( ?????BaseClass???? record)
{
    return record.slug = "...return...something...";
}

调用如:

string a = Slugify(my_State_object); <--- not working
string b = Slugify(my_City_object);  <--- not working

谢谢!

编辑: 州和城市是EF-CodeFirst类。最初都有Id和slug - fields。

然后我把它们变成了一个基类,因为我在两个(和其他)表中都有。

我想要一个返回slug的方法,如:

public string Slugify(string p, System.Data.Entity.DbSet<Models.BaseRecords> dbSet){ return ...}

称为

Slugify(text, my_State_object);

以及

Slugify(otherText, my_City_object);

这两个电话都给我一个“......一些无效的参数......”错误。

对不起,这是来自德国VS2010

5 个答案:

答案 0 :(得分:6)

你已经给出了答案:

public string Slugify(BaseClass record)
{
    return record.slug = "...return...something...";
}

问题是您的BaseClass应该与其子级一样可访问。把它公开,一切都会好的:

public abstract class BaseClass ...

答案 1 :(得分:3)

这是因为您的abstract基类不是公共的,因此它的子集不易访问。将其更改为:

public abstract class BaseClass
{
    public int Id { get; set; }
    public string slug { get; set; }
}

剩下的代码很好。

答案 2 :(得分:0)

我假设你生成一个slug的方式因每种类型而异。 State将基于StateName属性,而City将使用TownName属性。

我认为这可能是一种更好的方法:

public abstract class BaseClass
{
    public int Id { get; set; }
    public abstract string Slug { get; }
}

public class State:BaseClass
{
    public string StateName{ get; set; }
    public abstract string Slug 
    {
        get 
        {
            return Regex.Replace(StateName, '[^a-zA-Z0-9]', '-');
        }
    }
}

答案 3 :(得分:0)

是什么让你不能简单地访问基类的属性?

Class A
{
    public string Rawr {get; set;}
}

Class B : A
{
    public string Rawr2 { get { return Rawr; } set { Rawr = value; } }
}

var b = new B();
b.Rawr = "asdf"

Console.WriteLine(b.Rawr2);

答案 4 :(得分:0)

试试这个:

BaseClass baseClass = new BaseClass();
baseClass.slug = "initial value";
Console.WriteLine(baseClass.slug); // displays "initial value"
Slugify(baseClass);
Console.WriteLine(baseClass.slug); // displays "...return...something..."

State state = new State();
state.slug = "initial value";
Console.WriteLine(state.slug); // displays "initial value"
Slugify(state);
Console.WriteLine(state.slug); // displays "...return...something..."

你应该看到你的Slugify方法已经可以更改BaseClass和State类中的属性,只要你摆脱问号:

public string Slugify(BaseClass record)  
{
    return record.slug = "...return...something...";  
}