访问通用对象参数
本文关键字:参数 对象 访问 | 更新日期: 2023-09-27 18:33:06
请考虑以下代码片段:
public class FooRepository<T> : BaseRepository<T>
where T : EntityBase
{
public FooRepository(ISessionFactory sessionFactory)
: base(sessionFactory)
{
this.AfterWriteOperation += (sender, local) => this.Log();
}
public void Log()
{
// I want to access T here
}
}
我想访问Log()
函数中的T
,但问题是我无法更改构造函数签名,例如:FooRepository(ISessionFactory sessionFactory, T entity)
.我不知道如何将其传递给Log()
.
还有别的办法吗?
更新:
我想访问Log()
内部的T
实例。
更新 2:
好吧,对不起,弄得一团糟。我不习惯所有这些东西。我将尝试在这里澄清事情。所以我的存储库在服务层中调用:
BarRepository.Update(entityToPersist); // Bar inherits from Foo
在 Update
方法中,调用事件AfterWriteOperation
:
if (AfterWriteOperation != null)
AfterWriteOperation(this, e);
有了所有这些事情,我只是放弃了一个简单的事实,即在上述情况下e
是我的实体,所以我可以通过这种方式将其传递给 Log:
(sender, local) => this.Log(local); // I will rename local to entity
并把它放在方法里面。
喜欢
void Log(T entity)
并在方法中使用它。
好吧,就这样做:
using System;
namespace Works4Me
{
public interface ISessionFactory { }
public class EntityBase { }
public class BaseRepository<T> where T : EntityBase { }
public class FooRepository<T> : BaseRepository<T>
where T : EntityBase
{
public FooRepository(ISessionFactory sessionFactory)
{
}
public void Log(T entity)
{
}
}
public class Test
{
public static void Main()
{
// your code goes here
}
}
}
成功 #stdin #stdout 0.01s 33480KB
关于你的其他陈述:
我想访问
Log()
中的T
实例。
T
本身没有实例。你可以得到Type
对象,用typeof(T)
表示T
。
如果您想获取有关类型的信息,例如 Name
、 Methods
、 Interfaces
、 ...
然后在log
中使用 typeof(T
) - 这就像对实例的.GetType()
调用,并将返回泛型参数的类型。如果要使用该类型的任何实例,则必须
a) 创建实例(Activator.CreateInstance(typeof(T)))
或
b) 通过构造函数传递实例,然后传递到this.Log(passedInstance)
调用。